Поймать необработанное исключение, по-прежнему отображается диалоговое окно «Программа перестала работать»

Я прочитал в этом сообщении, что во избежание «программа остановлена работает », мне нужно перехватить необработанное исключение из AppDomain.

 public Form1()
 {
  ///Code
   AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
  ///more code
 }

     void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        var excep = e.ExceptionObject;

        //Writing the exception to log file with the stack flow
        Logger.Logger.LogException("UNHANDLED EXCEPTION:"+Environment.NewLine +excep.ToString(), this);

        //Terminate the logger (manual event waiting for file write to finish)
        Logger.Logger.Terminate();
        Environment.Exit(1);
    }

Но когда я вдыхаю исключение. Я вижу это записано в журнале, но приложение показывает диалог «программа перестала работать». может это быть вызвано строкой Logger.Terminate? (опять же - команда terminate ждет, пока все журналы не будут записаны в файл журнала)


person Izikon    schedule 25.11.2015    source источник
comment
Ваш обработчик событий также может аварийно завершить работу. Этот метод Terminate () звучит довольно рискованно. Даже Environment.Exit () может дать сбой, он все равно запускает финализаторы. Или что-то глупое, вроде ошибки в классе Logger, не станет лучше, если вы воспользуетесь ею в обработчике событий. В общем, в вашей программе произошло что-то неприятное, поэтому шансы, что это может дестабилизировать и ваш обработчик событий, никогда не равны нулю. Вы также довольно поздно подписались на событие, это нужно сделать в методе Main (), прежде чем делать что-либо еще.   -  person Hans Passant    schedule 27.11.2015
comment
Также возможно, что обработчик событий никогда не будет вызван. Некоторые исключения (StackOverflowException) могут остановить весь процесс до того, как какой-либо обработчик получит возможность запуститься.   -  person    schedule 27.11.2015
comment
Ребята, я вижу необработанное исключение в файле журнала, а также завершение файла журнала. так что это событие обрабатывается. Также у меня есть в основном тот же перехват события для исключения потока (спасибо!)   -  person Izikon    schedule 30.11.2015


Ответы (1)


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

Если вы выходите из программы с помощью Environment.Exit(1), вы в значительной степени говорите операционной системе: «Эй, я отключился!», Что является противоположностью изящного завершения. Попробуйте выйти с кодом 0 и посмотрите, не изменится ли это.

person João Mendes    schedule 27.11.2015