Событие System.AppDomain.UnhandledException

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Это UnhandledException событие предоставляет уведомление об неухваченных исключениях. Он позволяет приложению регистрировать сведения об исключении, прежде чем системный обработчик по умолчанию сообщает об исключении пользователю и завершает работу приложения. Если доступна достаточная информация о состоянии приложения, можно выполнить другие действия, например сохранение данных программы для последующего восстановления. Рекомендуется соблюдать осторожность, так как данные программы могут быть повреждены, если исключения не обрабатываются.

Это событие можно обрабатывать в любом домене приложения. Однако событие не обязательно вызывается в домене приложения, где произошло исключение. Исключение необработано только в том случае, если весь стек для потока был размножен без поиска применимого обработчика исключений, поэтому первое место, которое может быть вызвано событием, находится в домене приложения, где произошел поток.

UnhandledException Если событие обрабатывается в домене приложения по умолчанию, оно вызывается для любого необработанного исключения в любом потоке независимо от того, в каком домене приложения запущен поток. Если поток запускается в домене приложения с обработчиком событий для UnhandledExceptionэтого домена приложения, событие вызывается в этом домене приложения. Если этот домен приложения не является доменом приложения по умолчанию, а в домене приложения по умолчанию есть обработчик событий, событие вызывается в обоих доменах приложения.

Например, предположим, что поток начинается в домене приложения "AD1", вызывает метод в домене приложения "AD2", а оттуда вызывает метод в домене приложения "AD3", где он создает исключение. Первый домен приложения, в котором UnhandledException можно вызвать событие, — AD1. Если этот домен приложения не является доменом приложения по умолчанию, событие также может быть поднято в домене приложения по умолчанию.

Примечание.

Среда CLR приостанавливает прерывания потоков во время выполнения обработчиков событий для UnhandledException события.

Если обработчик событий имеет ReliabilityContractAttribute атрибут с соответствующими флагами, обработчик событий обрабатывается как ограниченный регион выполнения.

Начиная с платформа .NET Framework 4, это событие не вызывается для исключений, которые повреждают состояние процесса, например переполнения стека или нарушения доступа, если обработчик событий не является критически важным для безопасности и имеет HandleProcessCorruptedStateExceptionsAttribute атрибут.

Чтобы зарегистрировать обработчик событий для этого события, необходимо иметь необходимые разрешения или SecurityException возникать.

Дополнительные сведения об обработке событий см. в разделе "Обработка и создание событий".

Другие события для необработанных исключений

Для некоторых моделей приложений событие может быть предопределено другими событиями, UnhandledException если необработанное исключение возникает в основном потоке приложения.

В приложениях, использующих Windows Forms, необработанные исключения в основном потоке приложений вызывают Application.ThreadException событие. Если это событие обрабатывается, поведение по умолчанию заключается в том, что необработанное исключение не завершает работу приложения, хотя приложение остается в неизвестном состоянии. В этом случае UnhandledException событие не вызывается. Это поведение можно изменить с помощью файла конфигурации приложения или с помощью Application.SetUnhandledExceptionMode метода, чтобы изменить режим UnhandledExceptionMode.ThrowException до ThreadException подключения обработчика событий. Это относится только к основному потоку приложения. Событие UnhandledException вызывается для необработанных исключений, создаваемых в других потоках.

Платформа приложений Visual Basic предоставляет другое событие для необработанных исключений в основном потоке WindowsFormsApplicationBase.UnhandledException приложения — событие. Это событие имеет объект аргументов событий с тем же именем, что и объект аргументов событий, используемый AppDomain.UnhandledExceptionобъектом, но с различными свойствами. В частности, этот объект аргументов событий имеет ExitApplication свойство, которое позволяет приложению продолжать работу, игнорируя необработанное исключение (и оставляя приложение в неизвестном состоянии). В этом случае AppDomain.UnhandledException событие не вызывается.