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

голоса
23

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

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

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

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

Задан 04/08/2008 в 02:15
источник пользователем
На других языках...                            


5 ответов

голоса
11

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

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

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

Ответил 04/08/2008 в 05:31
источник пользователем

голоса
5

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

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

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

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

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

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

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

  • Ловит необработанное исключение, когда:
    • Исключение составляет от основного потока и без отладчика прилагается.
    • исключение происходит во время обработки окна сообщений.
    • jitDebugging = ложь в 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.

Это последнее событие ваш последний шанс войти необработанное исключение. Это вызвано, прежде чем ваши Наконец блоки выполнены. Вы можете перехватить это событие следующим образом:

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);
Ответил 20/09/2008 в 16:52
источник пользователем

голоса
4

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

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

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

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

Ответил 04/08/2008 в 11:20
источник пользователем

голоса
3

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

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

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

Ответил 04/08/2008 в 03:45
источник пользователем

голоса
1

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

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

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

Ответил 04/08/2008 в 03:54
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more