В приложениях, использующих Windows Forms, необработанные исключения в главном потоке приложений вызывают событие Application.ThreadException
. Если это событие обрабатывается, поведение по умолчанию состоит в том, что необработанное исключение не завершает приложение, хотя приложение остается в неизвестном состоянии. В этом случае событие UnhandledException
не вызывается. Это поведение можно изменить с помощью файла конфигурации приложения или с помощью метода Application.SetUnhandledExceptionMode
, чтобы изменить режим на UnhandledExceptionMode.ThrowException
до подключения обработчика событий ThreadException
. Это относится только к основному потоку приложения. Событие UnhandledException
возникает для необработанных исключений, созданных в других потоках.
Начиная с Visual Studio 2005 , среда приложения Visual Basic предоставляет другое событие для необработанных исключений в главном потоке приложения - WindowsFormsApplicationBase.UnhandledException
. Это событие имеет объект аргументов события с тем же именем, что и у объекта аргументов события, используемого AppDomain.UnhandledException, но с другими свойствами. В частности, этот объект аргументов события имеет свойство ExitApplication
, которое позволяет приложению продолжать работу, игнорируя необработанное исключение (и оставляя приложение в неизвестном состоянии). В этом случае событие AppDomain.UnhandledException не вызывается.
Application.ThreadException
может быть перехвачено, а приложение может продолжаться (в целом это не очень хорошая идея, но для приложения, например, для периодического запуска некоторых действий, это хорошее решение).
Чтобы перехватывать исключения, возникающие в потоках, которые не созданы и не принадлежат Windows Forms, используйте AppDomain.UnhandledException
. Это позволяет приложению регистрировать информацию об исключении до того, как системный обработчик по умолчанию сообщит об исключении пользователю и завершит работу приложения.
Обработка этого исключения не предотвращает завершение приложения.
Максимум, что может быть сделано (данные программы могут быть повреждены, если исключения не обрабатываются) - это сохранение данных программы для последующего восстановления. После этого домен приложения выгружается и приложение закрывается.
Начиная с .NET 4 , это событие не вызывается для исключений, которые портят состояние процесса, таких как переполнение стека или нарушения доступа, если обработчик событий не критичен для безопасности и не имеет HandleProcessCorruptedStateExceptionsAttribute
атрибут.
Подробнее см. MSDN .