Я написал приложение WinForms, которое выполняет какую-то синхронизацию. Я хочу, чтобы он продолжал работать, несмотря на любые случаи исключений, чтобы синхронизация продолжала идти со следующими попытками. Таким образом, я написал приложение таким образом, что всякий раз, когда возникает исключение, он регистрирует трассировку стека исключений, выполняет некоторую диагностику, затем записывает диагностическую информацию и продолжает следующие попытки синхронизации.
Для неперехваченных исключений я добавил обработчики исключений для Application.ThreadException
, а также для AppDomain.CurrentDomain.UnhandledException
в потоке Main()
:
static void Main(string[] args)
{
Application.ThreadException += new ThreadExceptionEventHandler(UIThreadExceptionHandler);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new myForm());
}
//exception handlers
public static void UIThreadExceptionHandler(object sender, ThreadExceptionEventArgs t)
{
logger.Fatal("Fatal Windows Forms Error");
logStackTrace(t.Exception); //logs the stack trace with some desired formatting
Application.Exit(new CancelEventArgs(true));
}
public static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs t)
{
logger.Fatal("Fatal Application Error");
logStackTrace((Exception)(t.ExceptionObject)); //logs the stack trace with some desired formatting
Application.Exit(new CancelEventArgs(true));
}
Я поддерживал приложение для тестирования и понял, что всякий раз, когда Application.ThreadException
поймается, приложение корректно регистрирует строку Fatal Windows Forms Error
, за которой следует трассировка стека исключений, а затем приложение завершает работу.
Я не хочу, чтобы приложение выходило. Я просто хочу, чтобы он регистрировал трассировку стека исключений и продолжал следующую попытку синхронизации. Исключение, происходящее в потоке пользовательского интерфейса, не является столь серьезным, поскольку одно и то же исключение произошло и в других/не-пользовательских потоках приложения, но оно не разбило приложение (как я вижу это в журналах). Однако, когда такое же исключение возникает в потоке пользовательского интерфейса, приложение вылетает.