【发布时间】:2014-06-02 21:56:12
【问题描述】:
我编写了一个执行某种同步工作的 WinForms 应用程序。尽管发生任何异常,我都希望它继续运行,以便在下次尝试时继续同步。因此,我编写了这样的应用程序,即每当发生异常时,它都会记录异常堆栈跟踪,执行一些诊断,然后记录诊断信息并继续下一次同步尝试。
对于未捕获的异常,我在Main() 线程中为Application.ThreadException 和AppDomain.CurrentDomain.UnhandledException 添加了异常处理程序:
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,然后是异常堆栈跟踪,然后应用程序退出。
我不希望应用退出。我只想让它记录异常堆栈跟踪并继续下一次同步尝试。 UI 线程中发生的异常并不那么严重,因为同样的异常也发生在应用程序的其他/非 UI 线程中,但它并没有使应用程序崩溃(正如我在日志中看到的那样)。但是,当 UI 线程中发生相同的异常时,应用程序会崩溃。
【问题讨论】:
-
问题是什么?您希望应用在出现未处理的异常后继续工作吗?
-
@Dmitry 是的,显然我在第一段中说过 希望它在发生任何异常的情况下继续运行
-
请想知道为什么投反对票
-
为什么要使用 Application.Exit(new CancelEventArgs(true));在 UIThreadExceptionHandler 中?删除它,用户界面不会关闭
-
糟糕,我想我有一些关于
Application.ThreadException和CancelEventArgs的坏信息。让我试试这个。我认为CancelEventArgs的true参数应该可以防止应用程序崩溃。我想我已经读过退出应用程序是Application.ThreadException的默认行为,为了防止我应该这样做Application.Exit(new CancelEventArgs(true));
标签: c# winforms exception unhandled-exception