попробуйте / поймать все исключения в C # - PullRequest
1 голос
/ 10 июля 2010

Я хотел бы перехватить все необработанные исключения в моем приложении пользовательского интерфейса в 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 ]

3 голосов
/ 10 июля 2010

Вы можете поместить этот код в свой 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 () (насколько я помню).

2 голосов
/ 10 июля 2010

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

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

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

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

1 голос
/ 10 июля 2010

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

...