System.AppDomain.UnhandledException-Ereignis

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Das UnhandledException Ereignis stellt eine Benachrichtigung über ungenaue Ausnahmen bereit. Die Anwendung ermöglicht es der Anwendung, Informationen über die Ausnahme zu protokollieren, bevor der Systemstandardhandler die Ausnahme an den Benutzer meldet und die Anwendung beendet. Wenn ausreichende Informationen über den Anwendungsstatus verfügbar sind, können weitere Maßnahmen ergriffen werden , z. B. das Speichern von Programmdaten für eine spätere Wiederherstellung. Vorsicht wird empfohlen, da Programmdaten beschädigt werden können, wenn Ausnahmen nicht behandelt werden. Der Handler wird auch ausgeführt, während sperrungen gehalten werden, wenn die Ausnahme ausgelöst wurde. Daher sollten Sie darauf achten, nicht auf andere Ressourcen zu warten, die Deadlocks auslösen könnten.

Dieses Ereignis kann in einer beliebigen Anwendungsdomäne behandelt werden. Das Ereignis wird jedoch nicht unbedingt in der Anwendungsdomäne ausgelöst, in der die Ausnahme aufgetreten ist. Eine Ausnahme ist nur dann unbehandelt, wenn der gesamte Stapel für den Thread entwoben wurde, ohne einen anwendbaren Ausnahmehandler zu finden. Daher befindet sich der erste Ort, an dem das Ereignis ausgelöst werden kann, in der Anwendungsdomäne, in der der Thread stammt.

Wenn das UnhandledException Ereignis in der Standardanwendungsdomäne behandelt wird, wird es für alle unbehandelten Ausnahmen in einem Thread ausgelöst, unabhängig davon, in welcher Anwendungsdomäne der Thread gestartet wurde. Wenn der Thread in einer Anwendungsdomäne gestartet wurde, für die ein Ereignishandler vorhanden UnhandledExceptionist, wird das Ereignis in dieser Anwendungsdomäne ausgelöst. Wenn diese Anwendungsdomäne nicht die Standardanwendungsdomäne ist und es auch einen Ereignishandler in der Standardanwendungsdomäne gibt, wird das Ereignis in beiden Anwendungsdomänen ausgelöst.

Angenommen, ein Thread beginnt in der Anwendungsdomäne "AD1", ruft eine Methode in der Anwendungsdomäne "AD2" auf, und von dort wird eine Methode in der Anwendungsdomäne "AD3" aufgerufen, wobei eine Ausnahme ausgelöst wird. Die erste Anwendungsdomäne, in der das UnhandledException Ereignis ausgelöst werden kann, ist "AD1". Wenn diese Anwendungsdomäne nicht die Standardanwendungsdomäne ist, kann das Ereignis auch in der Standardanwendungsdomäne ausgelöst werden.

Hinweis

Die Common Language Runtime hält Threadabbrüche an, während Ereignishandler für das UnhandledException Ereignis ausgeführt werden.

Wenn der Ereignishandler über ein ReliabilityContractAttribute Attribut mit den entsprechenden Flags verfügt, wird der Ereignishandler als eingeschränkter Ausführungsbereich behandelt.

Ab .NET Framework 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.

Um einen Ereignishandler für dieses Ereignis zu registrieren, müssen Sie über die erforderlichen Berechtigungen verfügen oder ein SecurityException Ereignis ausgelöst wird.

Weitere Informationen zur Behandlung von Ereignissen finden Sie unter behandeln und Auslösen von Ereignissen.

Andere Ereignisse für unbehandelte Ausnahmen

Bei bestimmten Anwendungsmodellen kann das UnhandledException Ereignis von anderen Ereignissen vorgelesen werden, wenn die unbehandelte Ausnahme im Hauptanwendungsthread auftritt.

In Anwendungen, die Windows Forms verwenden, führen unbehandelte Ausnahmen im Hauptanwendungsthread dazu, dass das Application.ThreadException Ereignis ausgelöst wird. Wenn dieses Ereignis behandelt wird, ist das Standardverhalten, dass die unbehandelte Ausnahme die Anwendung nicht beendet, obwohl die Anwendung in einem unbekannten Zustand verbleibt. In diesem Fall wird das UnhandledException Ereignis nicht ausgelöst. Dieses Verhalten kann mithilfe der Anwendungskonfigurationsdatei oder mithilfe der Application.SetUnhandledExceptionMode Methode geändert werden, um den Modus UnhandledExceptionMode.ThrowException zu ändern, bevor der ThreadException Ereignishandler eingebunden wird. Dies gilt nur für den Hauptanwendungsthread. Das UnhandledException Ereignis wird für unbehandelte Ausnahmen ausgelöst, die in anderen Threads ausgelöst werden.

Das Visual Basic-Anwendungsframework stellt ein weiteres Ereignis für unbehandelte Ausnahmen im Hauptanwendungsthread bereit – das WindowsFormsApplicationBase.UnhandledException Ereignis. Dieses Ereignis verfügt über ein Ereignisargumentobjekt mit demselben Namen wie das von AppDomain.UnhandledException, aber mit unterschiedlichen Eigenschaften verwendete Ereignisargumentobjekt. Insbesondere verfügt dieses Ereignisargumentobjekt über eine ExitApplication Eigenschaft, die es der Anwendung ermöglicht, die Ausführung fortzusetzen, wobei die unbehandelte Ausnahme ignoriert wird (und die Anwendung in einem unbekannten Zustand bleibt). In diesem Fall wird das AppDomain.UnhandledException Ereignis nicht ausgelöst.