Необработанный обработчик исключений в .NET 1.1

Я поддерживаю приложение .NET 1.1, и одна из задач, с которыми я столкнулся, - убедиться, что пользователь не видит никаких недружественных уведомлений об ошибках.

Я добавил обработчики к Application.ThreadExceptionи AppDomain.CurrentDomain.UnhandledException, которые действительно вызывают. Моя проблема заключается в том, что стандартное диалоговое окно ошибки CLR по-прежнему отображается (до вызова обработчика исключений).

Джефф рассказывает об этой проблеме в своем блоге здесь и здесь . Но нет решения. Так что же является стандартным способом в .NET 1.1 для обработки необработанных исключений и отображения дружественного диалогового окна?

Ответ Джеффа был помечен как правильный ответ, потому что ссылка, которую он предоставил, содержит наиболее полную информацию о том, как сделать то, что требуется.

4.08.2008 01:15:38
5 ОТВЕТОВ
РЕШЕНИЕ

О, в Windows Forms вы определенно должны иметь возможность заставить его работать. Единственное, на что вам следует обратить внимание - это то, что происходит в разных потоках.

У меня есть старая статья Code Project, которая должна помочь:

Удобная обработка исключений

12
31.08.2017 22:55:35

Поведение необработанных исключений в приложении Windows Forms .NET 1.x зависит от:

  • Тип потока, который выдал исключение
  • Произошло ли это во время обработки сообщения окна
  • Был ли отладчик подключен к процессу
  • Параметр реестра DbgJitDebugLaunchSetting
  • Флаг jitDebugging в App.Config
  • Перегрузили ли вы обработчик исключений Windows Forms
  • Обрабатывали ли вы событие исключения CLR
  • Фаза луны

Поведение необработанных исключений по умолчанию:

  • Если исключение возникает в основном потоке при прокачке оконных сообщений, оно перехватывается обработчиком исключений Windows Forms.
  • Если исключение возникает в основном потоке при прокачке оконных сообщений, оно завершит процесс приложения, если оно не будет перехвачено обработчиком исключений Windows Forms.
  • Если исключение возникает в ручном потоке, в пуле потоков или в потоке финализатора, оно проглатывается CLR.

Точки контакта для необработанного исключения:

  • Обработчик исключений Windows Forms.
  • Переключатель реестра JIT-отладки DbgJitDebugLaunchSetting.
  • Событие необработанного исключения CLR.

Встроенная обработка исключений формы Windows по умолчанию делает следующее:

  • Ловит необработанное исключение, когда:
    • исключение в основном потоке, и отладчик не подключен.
    • исключение происходит во время обработки сообщения окна.
    • jitDebugging = false в App.Config.
  • Показывает диалог для пользователя и предотвращает завершение приложения.

Вы можете отключить последнее поведение, установив jitDebugging = true в App.Config. Но помните, что это может быть вашим последним шансом остановить завершение работы приложения. Поэтому следующим шагом для обнаружения необработанного исключения является регистрация события Application.ThreadException, например:

Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);

Обратите внимание на параметр реестра DbgJitDebugLaunchSetting в разделе HKEY_LOCAL_MACHINE \ Software.NetFramework. Это имеет одно из трех значений, о которых я знаю:

  • 0: показывает диалог пользователя с вопросом «отладка или завершение».
  • 1: позволяет исключению работать с CLR.
  • 2: запускает отладчик, указанный в разделе реестра DbgManagedDebugger.

В Visual Studio перейдите в меню ИнструментыПараметрыОтладкаJIT, чтобы установить для этого ключа значение 0 или 2. Но значение 1 обычно лучше всего подходит для компьютера конечного пользователя. Обратите внимание, что этот раздел реестра действует до события необработанного исключения CLR.

Последнее событие - ваш последний шанс зарегистрировать необработанное исключение. Он сработает до того, как будут выполнены ваши блоки finally. Вы можете перехватить это событие следующим образом:

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);
5
18.03.2020 11:22:42

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

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

Нет единого решения этой ошибки. Вам необходимо поместить настоящий обработчик исключений (блок перехвата) перед всеми местами, где возникает эта ошибка, и направить его (например) в глобальный метод / класс обработчика, который определит, безопасно ли просто сообщать и продолжать, основываясь на тип исключения и / или содержание.

Редактировать: можно отключить (= взломать) механизм сообщений об ошибках, встроенный в Windows, поэтому обязательное диалоговое окно «сбой и запись» не отображается, когда приложение закрывается. Однако это становится эффективным для всех приложений в системе, а не только для ваших собственных.

5
18.03.2020 11:22:54

Это консольное приложение или приложение Windows Forms? Если это консольное приложение .NET 1.1, то, к сожалению, это по замыслу - это подтверждается разработчиком MSFT во втором сообщении в блоге, на которое вы ссылались :

Кстати, на моей машине 1.1 пример из MSDN имеет ожидаемый результат; просто вторая строка не появляется, пока вы не подключите отладчик (или нет). В v2 мы перевернули вещи так, что событие UnhandledException срабатывает до того, как подключается отладчик, что, по-видимому, и ожидается большинством людей.

Похоже, что .NET 2.0 делает это лучше (слава богу), но, честно говоря, у меня никогда не было времени, чтобы вернуться и проверить.

3
21.10.2018 07:24:10

Это приложение Windows Forms. Исключения, которые перехватываются Application.ThreadException, работают нормально, и я не получаю уродливое поле исключений .NET ( OKдля завершения, Cancelдля отладки? Кто придумал это?).

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

Поэтому мне остается только надеяться, что нет других обстоятельств, которые могли бы привести к тому, что исключения не будут обработаны обработчиком Application.ThreadException.

1
31.08.2017 22:58:03