Попробуйте / поймать все исключения в 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() (насколько я помню).
У Питера Бромберга есть хорошая статья о различных способах обработки необработанных исключений. Он описывает следующие подходы:
- Помещение Application.Run() в блок try-catch
- Использование события Application.ThreadException
- Использование события AppDomain.UnhandledException
- Добавьте запись в реестр, чтобы открыть JIT Debugger
- Используйте ADPLUS в режиме сбоя с установленными символами отладки.
Получение лучшей информации о необработанных исключениях
По поводу моего предыдущего комментария по этому вопросу: если только нет острой необходимости перезапускать сбойное приложение - я не буду автоматически перезапускать приложение из-за цикла, в котором вы можете застрять. Если вам необходимо перезапустить его, предоставьте пользователю выбор: перезапустите приложение перед перезапуском. Таким образом, если он продолжает идти не так, пользователь может внести залог.
Вам необходимо подписаться на UnhandledException
событие в AppDomain
, См. http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception(VS.71).aspx