代码之家  ›  专栏  ›  技术社区  ›  JohnIdol

application.threadeexception和appdomain.currentdomain.unhandledexception有什么区别?

  •  100
  • JohnIdol  · 技术社区  · 15 年前

    好吧,这很简单:

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

    • 我需要两者都处理吗?

    谢谢!

    4 回复  |  直到 10 年前
        1
  •  95
  •   Hans Passant    10 年前

    application.threadexception特定于Windows窗体。WinForms运行事件处理程序以响应Windows发送给它的消息。例如,单击事件,我确信您了解它们。如果这样的事件处理程序引发异常,那么在winforms消息循环中会有一个back-stop来捕获该异常。

    那个后盾触发了 Application.ThreadException 事件。如果不重写它,用户将得到 ThreadExceptionDialog . 这允许他忽略异常并继续运行您的程序。不是个好主意。

    您可以通过调用 Application.SetUnhandledExceptionMode() 在program.cs的main()方法中。如果没有适当的backstop,当线程因未处理的异常而死亡时,通常会发生以下情况: AppDomain.UnhandledException 激发,程序终止。

    fwiw:“threadexception”是一个非常糟糕的名字选择。它与线程无关。

        2
  •  33
  •   serhio    11 年前

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

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

    应用程序线程例外 会被抓住的 应用程序可以继续 (一般来说,这不是一个好主意,但是对于应用程序来说,比如定期运行一些操作,这是一个很好的解决方案)。

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

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

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

        3
  •  18
  •   serhio    14 年前

    好的-我把它放在我面前,这段代码来自 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());
    }
    
        4
  •  0
  •   Sumit Pathak    10 年前

    问题是, ThreadException 由于线程出现问题而发生, Unhandled Exception 如果代码引发未处理的异常,则激发。

    造成第二个问题的简单方法是创建一个没有尝试的应用程序…捕获块并抛出异常。

    现在,如果你需要保险,你可以同时处理这两个问题,但是如果你捕获并处理你的 exceptions 正确的话,你不应该需要 UnhandledException 处理程序,因为它有点像“一网打尽”。