В чем разница между Application.ThreadException и AppDomain.CurrentDomain.UnhandledException?
Хорошо, это легко:
-
В чем разница между
Application.ThreadException
и
AppDomain.CurrentDomain.UnhandledException
? -
Нужно ли мне обрабатывать оба?
Благодаря!
- Служба имеет нулевые приложения (неинфраструктурные) конечные точки
- Какие исключения я не должен улавливать?
- Поймать исключение, вызванное асинхронным методом
- Настройка приоритета нескольких @ControllerAdvice @ExceptionHandlers
- Обработка исключительных ситуаций ASP.NET Core Web API
- Лучшее исключение для неисчерпывающих шаблонов в случае
- Что на самом деле происходит в try {return x; } наконец {x = null; } заявление?
- Как поймать ВСЕ исключения / сбои в приложении .NET
Application.ThreadException относится к Windows Forms. Winforms запускает обработчики событий в ответ на сообщения, отправленные ему Windows. Например, событие Click, я уверен, что вы их знаете. Если такой обработчик события генерирует исключение, то внутри цикла сообщений Winforms есть обратная остановка, которая ловит это исключение.
Этот обратный ток запускает событие Application.ThreadException . Если вы не переопределите его, пользователь получит ThreadExceptionDialog . Это позволяет ему игнорировать исключение и продолжать работу с вашей программой. Не очень хорошая идея кстати.
Вы можете отключить это поведение, вызвав Application.SetUnhandledExceptionMode () в методе Main () в Program.cs. Без этой блокировки на месте обычная вещь случается, когда stream умирает из необработанного исключения: AppDomain.UnhandledException срабатывает, и программа завершается.
Fwiw: «ThreadException» был очень плохим выбором имени. Это не имеет ничего общего с streamами.
В приложениях, использующих Windows Forms, необработанные исключения в основном streamе приложения вызывают событие Application.ThreadException
. Если это событие обрабатывается, поведение по умолчанию заключается в том, что необработанное исключение не завершает приложение, хотя приложение остается в неизвестном состоянии. В этом случае событие UnhandledException
не UnhandledException
. Это поведение можно изменить с помощью файла конфигурации приложения или с помощью метода Application.SetUnhandledExceptionMode
чтобы изменить режим на UnhandledExceptionMode.ThrowException
до того, ThreadException
обработчик события ThreadException
подключен. Это относится только к основной теме приложения. Событие UnhandledException
для необработанных исключений, UnhandledException
в других streamах.
Начиная с Visual Studio 2005 , инфраструктура приложения Visual Basic предоставляет другое событие для необработанных исключений в основном streamе приложения – WindowsFormsApplicationBase.UnhandledException
. Это событие имеет объект аргументов событий с тем же именем, что и объект аргументов события, используемый AppDomain.UnhandledException, но с разными свойствами. В частности, этот аргумент событий имеет свойство ExitApplication
которое позволяет приложению продолжать работу, игнорируя необработанное исключение (и оставляя приложение в неизвестном состоянии). В этом случае событие AppDomain.UnhandledException не создается.
Application.ThreadException
можно поймать, и приложение может продолжить (в общем, это не отличная идея, но для приложения, например, периодически выполняются некоторые действия, это хорошее решение).
Чтобы перехватывать исключения, возникающие в streamах, не созданных и принадлежащих Windows Forms, используйте AppDomain.UnhandledException
. Он позволяет приложению регистрировать информацию об исключении, прежде чем системный обработчик по умолчанию сообщает об исключении пользователю и завершает работу приложения.
Обработка этого исключения не препятствует прекращению приложения.
Максимум, который может быть выполнен (данные программы могут быть повреждены, если исключения не обрабатываются) – это сохранение данных программы для последующего восстановления. После этого домен приложения выгружается и приложение завершается.
Начиная с .NET 4 , это событие не возникает для исключений, которые повреждают состояние процесса, такого как переполнение стека или нарушения доступа, если обработчик событий не критичен с точки HandleProcessCorruptedStateExceptionsAttribute
безопасности и имеет атрибут HandleProcessCorruptedStateExceptionsAttribute
.
Подробнее см. В MSDN .
ОК – я передо мной, этот бит кода из msdn довольно понятен:
public static void Main(string[] args) { // Add the event handler for handling UI thread exceptions to the event. Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException); // Set the unhandled exception mode to force all Windows Forms // errors to go through our handler. Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); // Add the event handler for handling non-UI thread exceptions to the event. AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); // Runs the application. Application.Run(new ErrorHandlerForm()); }
Ну, дело в том, что ThreadException
возникает из-за проблемы с вашим streamом, Unhandled Exception
запускается, если код генерирует исключение, которое не обрабатывается.
Легкий способ вызвать второй – создать приложение, не пытающееся … блокировать блоки и исключать исключение.
Теперь, если вам нужна страховка, вы можете справиться с ними обоими, однако, если вы правильно захватите и обработаете свои exceptions
вам не понадобится обработчик UnhandledException
как это похоже на уловку.