Application.ThreadException和AppDomain.CurrentDomain.UnhandledException有什么区别?

Joh*_*dol 103 .net c# exception-handling winforms

好吧,这很简单:

  • Application.ThreadException和之间有什么区别
    AppDomain.CurrentDomain.UnhandledException

  • 我需要处理两者吗?

谢谢!

Han*_*ant 96

Application.ThreadException特定于Windows窗体.Winforms运行事件处理程序以响应Windows发送给它的消息.例如,Click事件,我相信你知道它们.如果这样的事件处理程序抛出异常,那么Winforms消息循环中会有一个后退停止捕获该异常.

该backstop将触发Application.ThreadException事件.如果不覆盖它,用户将获得ThreadExceptionDialog.这允许他忽略异常并继续运行程序.顺便说一句,这不是一个好主意.

您可以通过在Program.cs中的Main()方法中调用Application.SetUnhandledExceptionMode()来禁用此行为.如果没有该止回器,当线程从未处理的异常中死亡时,通常会发生:AppDomain.UnhandledException触发并且程序终止.

Fwiw:"ThreadException"是一个非常糟糕的名字选择.它与线程无关.

  • 鉴于winforms绑定到单个线程,我总是把它读作Application-thread异常. (2认同)

ser*_*hio 34

在使用Windows窗体的应用程序中,主应用程序线程中未处理的异常会导致引发Application.ThreadException事件.如果处理此事件,则默认行为是未处理的异常不会终止应用程序,尽管应用程序处于未知状态.在这种情况下,UnhandledException 不会引发事件.可以通过使用应用程序配置文件或使用该Application.SetUnhandledExceptionMode方法将模式更改 为连接事件处理程序UnhandledExceptionMode.ThrowException之前更改此行为ThreadException.这仅适用于主应用程序线程.UnhandledException 针对在其他线程中抛出的未处理异常引发该事件.

Visual Studio 2005开始,Visual Basic应用程序框架为主应用程序线程中的未处理异常提供了另一个事件 - WindowsFormsApplicationBase.UnhandledException.此事件具有一个事件参数对象,其名称与AppDomain.UnhandledException使用的事件参数对象相同,但具有不同的属性.特别是,此事件参数对象具有ExitApplication允许应用程序继续运行的属性,忽略未处理的异常(并使应用程序处于未知状态).在这种情况下,不会引发AppDomain.UnhandledException事件.

Application.ThreadException可以捕获并且应用程序可以继续(通常不是一个好主意,但对于应用程序,如定期运行某些操作,这是一个很好的解决方案).

要捕获未由Windows窗体创建和拥有的线程中发生的异常,请使用AppDomain.UnhandledException.它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息.
处理此异常不会阻止应用程序终止.
可以完成的最大值(程序数据在未处理异常时可能会损坏)正在保存程序数据以供以后恢复.之后,卸载应用程序域并终止应用程序.

.NET 4开始,不会针对损坏进程状态的异常(例如堆栈溢出或访问冲突)引发此事件,除非事件处理程序是安全关键且具有该HandleProcessCorruptedStateExceptionsAttribute 属性.

有关更多详细信息,请参阅MSDN.


Joh*_*dol 18

好的 - 我把它放在我面前,来自msdn的这段代码非常明显:

public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new 
        ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

    // Set the unhandled exception mode to force all Windows Forms 
    // errors to go through our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}
Run Code Online (Sandbox Code Playgroud)

  • 这与serhio的另一个答案相反,他说:在连接ThreadException事件处理程序之前,应该设置UnhandledExceptionMode.ThrowException.不确定订单是否真的重要...... (3认同)