Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Это UnhandledException событие предоставляет уведомление об неухваченных исключениях. Он позволяет приложению регистрировать сведения об исключении, прежде чем системный обработчик по умолчанию сообщает об исключении пользователю и завершает работу приложения. Если доступна достаточная информация о состоянии приложения, можно выполнить другие действия, например сохранение данных программы для последующего восстановления. Рекомендуется соблюдать осторожность, так как данные программы могут быть повреждены, если исключения не обрабатываются. Обработчик также будет работать, удерживая блокировки, существовавшие при возникновении исключения, поэтому нужно проявить осторожность, чтобы избегать ожидания освобождения других ресурсов, которые могут привести к взаимоблокировкам.
Это событие можно обрабатывать в любом домене приложения. Однако событие не обязательно вызывается в домене приложения, где произошло исключение. Исключение является необработанным только в том случае, если весь стек для потока был размотан без поиска применимого обработчика исключений, поэтому первое место, где может быть поднято событие, находится в домене приложения, в котором поток был инициирован.
UnhandledException Если событие обрабатывается в домене приложения по умолчанию, оно вызывается для любого необработанного исключения в любом потоке независимо от того, в каком домене приложения запущен поток. Если поток запускается в домене приложения, который имеет обработчик событий для UnhandledException, то событие вызывается в этом домене приложения. Если этот домен приложения не является доменом приложения по умолчанию, а в домене приложения по умолчанию есть обработчик событий, событие вызывается в обоих доменах приложения.
Например, предположим, что поток начинается в домене приложения "AD1", вызывает метод в домене приложения "AD2", а оттуда вызывает метод в домене приложения "AD3", где он создает исключение. Первый домен приложения, в котором можно вызвать событие, — это "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 событие не вызывается.