Antworten:
Application.ThreadException ist spezifisch für Windows Forms. Winforms führt Ereignishandler als Antwort auf von Windows an Winforms gesendete Nachrichten aus. Das Click-Ereignis zum Beispiel, ich bin sicher, dass Sie sie kennen. Wenn ein solcher Ereignishandler eine Ausnahme auslöst, gibt es in der Winforms-Nachrichtenschleife einen Back-Stop, der diese Ausnahme abfängt.
Dieser Backstop löst das Application.ThreadException- Ereignis aus. Wenn Sie es nicht überschreiben, erhält der Benutzer einen ThreadExceptionDialog . Dadurch kann er die Ausnahme ignorieren und Ihr Programm weiter ausführen. Übrigens keine gute Idee.
Sie können dieses Verhalten deaktivieren, indem Sie Application.SetUnhandledExceptionMode () in der Main () -Methode in Program.cs aufrufen . Ohne diesen Backstop geschieht das Übliche, wenn ein Thread aufgrund einer nicht behandelten Ausnahme stirbt: AppDomain.UnhandledException wird ausgelöst und das Programm wird beendet.
Fwiw: "ThreadException" war eine sehr schlechte Namenswahl. Es hat nichts mit Threads zu tun.
Aus der Quelle :
In Anwendungen, die Windows Forms verwenden, führen nicht behandelte Ausnahmen im Hauptanwendungsthread dazu, dass das
Application.ThreadException
Ereignis ausgelöst wird . Wenn dieses Ereignis behandelt wird, ist das Standardverhalten, dass die nicht behandelte Ausnahme die Anwendung nicht beendet, obwohl die Anwendung in einem unbekannten Zustand belassen wird. In diesem Fall wird dasUnhandledException
Ereignis nicht ausgelöst. Dieses Verhalten kann mithilfe der Anwendungskonfigurationsdatei oder mithilfe derApplication.SetUnhandledExceptionMode
Methode zum Ändern des ModusUnhandledExceptionMode.ThrowException
vor dem Anschließen desThreadException
Ereignishandlers geändert werden. Dies gilt nur für den Hauptanwendungsthread. DasUnhandledException
Ereignis wird für nicht behandelte Ausnahmen ausgelöst, die in anderen Threads ausgelöst werden.Ab Visual Studio 2005 bietet das Visual Basic- Anwendungsframework ein weiteres Ereignis für nicht behandelte Ausnahmen im Hauptanwendungsthread -
WindowsFormsApplicationBase.UnhandledException
. Dieses Ereignis verfügt über ein Ereignisargumentobjekt mit demselben Namen wie das von AppDomain.UnhandledException verwendete Ereignisargumentobjekt, jedoch mit unterschiedlichen Eigenschaften. Insbesondere verfügt dieses Ereignisargumentobjekt über eineExitApplication
Eigenschaft, mit der die Anwendung weiter ausgeführt werden kann, wobei die nicht behandelte Ausnahme ignoriert wird (und die Anwendung in einem unbekannten Zustand belassen wird). In diesem Fall wird das Ereignis AppDomain.UnhandledException nicht ausgelöst.
Application.ThreadException
kann abgefangen werden und die Anwendung könnte fortgesetzt werden (im Allgemeinen ist dies keine gute Idee, aber für die Anwendung, die regelmäßig einige Aktionen ausführt, ist dies eine gute Lösung).
Verwenden Sie die Option zum Abfangen von Ausnahmen, die in Threads auftreten, die nicht von Windows Forms erstellt wurden und deren Eigentümer Windows Forms ist AppDomain.UnhandledException
. Es ermöglicht der Anwendung, Informationen über die Ausnahme zu protokollieren, bevor der Systemstandardhandler die Ausnahme an den Benutzer meldet und die Anwendung beendet.
Die Behandlung dieser Ausnahme verhindert nicht, dass die Anwendung beendet wird.
Das Maximum, das getan werden kann (Programmdaten können beschädigt werden, wenn Ausnahmen nicht behandelt werden), ist das Speichern von Programmdaten für eine spätere Wiederherstellung. Danach wird die Anwendungsdomäne entladen und die Anwendung beendet.
Ab .NET 4 wird dieses Ereignis nicht für Ausnahmen ausgelöst, die den Status des Prozesses beschädigen, z. B. Stapelüberläufe oder Zugriffsverletzungen, es sei denn, der Ereignishandler ist sicherheitskritisch und verfügt über das
HandleProcessCorruptedStateExceptionsAttribute
Attribut.
Weitere Informationen finden Sie unter MSDN .
OK - ich hatte es vor mir, dieser Code von msdn ist ziemlich selbsterklärend:
public static void Main(string[] args)
{
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new
ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
// Set the unhandled exception mode to force all Windows Forms
// errors to go through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
// Runs the application.
Application.Run(new ErrorHandlerForm());
}
Nun, die Sache ist, ThreadException
tritt aufgrund eines Problems mit Ihrem Thread auf, das Unhandled Exception
ausgelöst wird, wenn Sie Code eine Ausnahme auslösen, die nicht behandelt wird.
Der einfachste Weg, den zweiten zu verursachen, besteht darin, eine App ohne Versuch zu erstellen ... Blöcke zu fangen und eine Ausnahme auszulösen.
Wenn Sie jetzt eine Versicherung benötigen, können Sie beide behandeln. Wenn Sie jedoch Ihre exceptions
Daten erfassen und korrekt behandeln, sollten Sie den UnhandledException
Handler nicht benötigen, da er wie ein Fang für alle ist.
Application.ThreadException
. Ich habe hier [mit ] meinem kleinen C # -Code eine Frage dazu gestellt .