2010-07-09 13 views
20

Was ist der Unterschied zwischen AppDomain.UnhandledException und Application.DispatcherUnhandledException in .NET?Unterschied zwischen UnhandledException und DispatcherUnhandledException in .NET

Ich brauche ein Ereignis, das ausgelöst wird, wenn eine nicht behandelte Ausnahme auftritt. Ich bin auf diese beiden gestoßen, aber ich weiß nicht, auf welche Weise sie sich voneinander unterscheiden. Gibt es auch Fälle, in denen sie nicht gefeuert werden?

Antwort

11

Application.DispatcherUnhandledException behandelt Ausnahmen, die im Hauptthread der Benutzeroberfläche in einer WPF-Anwendung ausgelöst werden. AppDomain.UnhandledException behandelt Ausnahmen, die auf einen Thread geworfen und nie abgefangen werden. Dies umfasst manuell erstellte Threads oder den Hauptthread in einer Konsolenanwendung. WPF fängt die Ausnahmen im UI-Thread ab, sodass Sie diese nicht in AppDomain.UnhandledException sehen.

Beachten Sie auch, dass unbehandelte Ausnahmen in der Regel die Laufzeit beenden, so dass Ihr Programm nach AppDomain.UnhandledException sofort beendet wird. Im Gegensatz dazu fängt Application.DispatcherUnhandledException Ausnahmen ab und lässt Ihr Programm weiterlaufen.

+7

Wenn Application.DispatcherUnhandledException nicht verwendet wird, werden diese Ausnahmen in AppDomain.UnhandledException angezeigt und die Anwendung wird sofort beendet. – stijn

+0

Anwendung wird nicht vorhanden sein, wenn die Ausnahme abgefangen und behandelt wird.Sowohl die Antwort als auch der Kommentar implizieren, dass die Anwendung entweder beendet wird, was falsch ist. – vikp

2

http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx

sagt:

"DispatcherUnhandledException durch eine Anwendung für jede Ausnahme ausgelöst wird, die durch Ausführen von Code auf dem Haupt UI Thread unhandled ist."

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

sagt:

„Dieses Ereignis kann in jeder Anwendungsdomäne behandelt werden jedoch wird das Ereignis nicht unbedingt in der Anwendungsdomäne angehoben, wo die Ausnahme aufgetreten ist..“

So DispatcherUnhandledException ist für UI-Thread-Ausnahmen und AppDomain.UnhandledException ist für alles andere.

Hoffe, dass hilft!

8

DispatcherUnhandledException wird nur vom Benutzeroberflächenthread ausgelöst und nur dann, wenn beim Ausführen eines Ereignisses eine Ausnahme ausgelöst wurde. Es gibt eine gewisse Tradition, diese Art von Ausnahmen speziell zu behandeln, Windows Forms hat es auch mit Application.ThreadException (schlecht benannt, nichts mit Threads zu tun).

Der Grund ist, dass es eine geringe Chance gibt, die Ausnahme zu behandeln und das Programm am Leben zu erhalten, da UI-Ereignishandler den Status des Programms nicht immer zu stark verändern. Dies erfordert große Portionen von Wunschdenken. In Windows Forms ist dies extrem, es wird ein ThreadExceptionDialog mit der Schaltfläche "Fortfahren" angezeigt, mit dem der Benutzer die Ausnahme ignorieren kann. WPF tut das nicht, Sie müssten einen solchen Dialog selbst schreiben. Deshalb ist die Veranstaltung da.

Die Standardaktion von DispatcherUnhandledException besteht darin, die Ausnahme nicht abzufangen. Sie können es also ignorieren, AppDomain.UnhandledException wird als nächstes ausgelöst.

Verwandte Themen