В чем разница между Application.ThreadException и AppDomain.CurrentDomain.UnhandledException?

Хорошо, это легко:

Благодаря!

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 как это похоже на уловку.

  • Исключение исключений нарушения доступа?
  • Когда я должен действительно использовать noexcept?
  • Каков правильный способ повторного выброса исключения в C #?
  • О ловле любого исключения
  • Обработка исключений в R
  • Как проверить действительный xml в строковом вводе перед вызовом .LoadXml ()
  • try / catch против бросков Exception
  • Должны ли блокировать java try так сильно, насколько это возможно?
  • Рекомендации по перехвату и повторному запуску .NET-исключений
  • попробуйте поймать окончательный вопрос
  • Исключение обработчика уровня сервиса в интерфейсе Java EE
  • Interesting Posts

    Просмотр мобильных веб-сайтов с рабочего стола / ноутбука

    Аутентификация Firebase не отменяется при удалении пользователя?

    PdfBox кодирует символ валюты евро

    Как получить один файл из определенной версии в Git

    Панель навигации Outlook 2010 – отображение непрочитанного числа в почтовом ящике

    Reflection MethodInfo.Invoke () catch исключений изнутри метода

    «Взаимозависимость» (DI) «дружественная» библиотека

    Установка приложения для текущего пользователя с помощью установщика Inno Setup под управлением администратора

    Установка максимальной ширины в ViewGroup

    Как создать файл .jar или экспортировать jar на IntelliJ (например, экспорт java-архива eclipse)

    Сокращение клавиатуры Firefox для переключения поисковых систем в строке поиска

    Выявление идентификаторов базы данных – риск для безопасности?

    Неправильное соотношение сторон в mp4 (H.264), созданное камерой Samsung

    Java: зачем вам нужно указывать ‘f’ в streamовом литерале?

    Почему не закрывается вкладка Удалить сеанс Cookie?

    Давайте будем гением компьютера.