Попробуйте / поймать все исключения в C#

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

Как я могу просто сделать это? Я старался:

try
{
 Application.EnableVisualStyles();
 Application.SetCompatibleTextRenderingDefault(false);
 Application.Run(new MainDlg());
}
catch (Exception e)
{
 Logger.Log(e);
 Logger.PostLog();
  System.Diagnostics.Process.Start("App.exe");
}

Но это пропускает некоторые исключения.

3 ответа

Решение

Вы можете поместить этот код в свой Program.cs:

    static void Application_ThreadException(object sender,
        ThreadExceptionEventArgs e) //Generic error handler
    {
        MyApp.LogException(e.Exception); //Log exception

        BugReport frmBugReport = new BugReport();
        frmBugReport.Error = e.Exception;
        frmBugReport.ShowDialog();

        Environment.Exit(0);
    }

Я показываю сообщение об ошибке в моем приложении. Вы можете изменить Environment.Exit(0) с помощью Application.Restart() (насколько я помню).

У Питера Бромберга есть хорошая статья о различных способах обработки необработанных исключений. Он описывает следующие подходы:

  1. Помещение Application.Run() в блок try-catch
  2. Использование события Application.ThreadException
  3. Использование события AppDomain.UnhandledException
  4. Добавьте запись в реестр, чтобы открыть JIT Debugger
  5. Используйте ADPLUS в режиме сбоя с установленными символами отладки.

Получение лучшей информации о необработанных исключениях

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

Вам необходимо подписаться на UnhandledException событие в AppDomain, См. http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception(VS.71).aspx

Другие вопросы по тегам