Новый атрибут HandleProcessCorruptedStateExceptions в .NET 4 - PullRequest
5 голосов
/ 02 июня 2010

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

Мне удалось вручную вывести приложение из строя, вызвав Environment.FailFast("crash");. (Мне также удалось вывести его из строя с помощью кода Ганса из « Как смоделировать исключение поврежденного состояния в .NET 4? ».)

Приложение вызывает вышеуказанный код сбоя при нажатии на кнопку. Вот мои обработчики исключений:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

        DispatcherUnhandledException += app_DispatcherUnhandledException;
    }

    [HandleProcessCorruptedStateExceptions]
     void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        //log..
    }

    [HandleProcessCorruptedStateExceptions]
     void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
    {
        //log..
    }

    [HandleProcessCorruptedStateExceptions]
     void app_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        //log..
    }

Комментарий //log..., показанный выше, только для иллюстрации; там есть настоящий лог-код.

При запуске в Visual Studio выдается исключение, но оно не «всплывает» до тех блоков обработки исключений. При работе в автономном режиме (без подключенного отладчика) я не получаю никаких журналов, несмотря на то, что ожидаю.

Почему это так и как заставить обрабатываться код обработки?

Ответы [ 3 ]

5 голосов
/ 01 сентября 2010

Атрибут должен быть помещен в метод, содержащий try / catch, а не в обработчики событий.

Пример приведен в моем ответе на этот вопрос

2 голосов
/ 11 июня 2014
  1. Целью FailFast () является немедленный выход, поэтому обработчики не вызываются.
  2. Даже некоторые «поврежденные состояния исключений» не могут быть перехвачены этими обработчиками - важным примером является StackOverflowException (на самом деле я пытался отловить одно в приложении ASP.NET, и оно не работало, хотя атрибут присутствовал ).

Ответ основан на этом сообщении: www.naveenbhat.in/2013/02/tips-and-tricks-of-exception-handling_28.html

1 голос
/ 26 января 2017

Обработчик события должен быть отмечен как [HandleProcessCorruptedStateExceptions], так и [SecurityCritical] для запуска обработчика события. Это требование упоминается в разделе замечаний FirstChanceException и UnhandledException.

Замечания DispatcherUnhandledException не означают, что вы можете обрабатывать в нем исключения поврежденного состояния, поэтому это может быть невозможно с этим событием.

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

...