none
C# ThreadException 和 UnhandledException的区别? RRS feed

  • 问题

  • 开发软件的时候经常会用到这两个捕获异常的方式,但对其两种捕获方式的区别一直不清楚,看过MSDN,但看不明白,各位能给解释一下否?

    举例如下:

    static void Main()
     2 {
     3   try {
     4     // Setup unhandled exception handlers
     5     //
     6     AppDomain.CurrentDomain.UnhandledException +=
     7     new
     UnhandledExceptionEventHandler(OnUnhandledException);
     8 
     9     // Unhandled Forms exceptions will be delivered to our ThreadException handler
    10     //
    11     Application.ThreadException +=
    12     new
     System.Threading.ThreadExceptionEventHandler(AppThreadException);
    13     
    14   }
    15   catch( Exception e ) {  }
    16 }
    17 
    18 /// <summary>
    19 /// CLR unhandled exception
    20 /// </summary>
    21 private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e)
    22 {
    23   HandleUnhandledException(e.ExceptionObject);
    24 }
    25 
    26 /// <summary>
    27 /// Displays dialog with information about exceptions that occur in the application.
    28 /// </summary>
    29 private static void AppThreadException(object source, System.Threading.ThreadExceptionEventArgs e)
    30 {
    31   HandleUnhandledException(e.Exception);
    32 }
    33 
    34 static void HandleUnhandledException(Object o)
    35 {
    36   Exception exp = o as Exception;
    37   MessageBox.Show(exp.Message, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    38 
    39   Application.Exit(); // Shutting down
    40 }

     

    非常感谢。

    2010年5月4日 3:10

答案

  • 你好!

         ThreadException仅能处理主线程中未处理的异常,如果异常 发生在别的线程上,这个事件不会触发的。这时可以使用AppDomain.UnhandledException 替代Application.ThreadException 来处理这类情况


    周雪峰
    2010年5月4日 5:32
    版主
  • System.Windows.Forms.Application.ThreadException 是针对于 Windows Forms 应用程序的。对于所有的 Windows Forms 程序,其主入口点都应该是单线程单元 (STA)。在这种方式下,ThreadException 事件仅处理 UI 线程上的未处理异常。其他线程上的异常无法被该事件处理。

    System.AppDomain.UnhandledException 发生在一个特定的 AppDomain 上。一个 AppDomain 包含多个程序集,而这些程序集又可能包含各种不同类型的程序,如 Console Application 或者 DLL。这个事件是 AppDomain 级别的,所有被当前 AppDomain 加载的程序集中的未处理异常,都能被处理。


    Mark Zhou
    2010年5月4日 7:35

全部回复

  • 你好!

         ThreadException仅能处理主线程中未处理的异常,如果异常 发生在别的线程上,这个事件不会触发的。这时可以使用AppDomain.UnhandledException 替代Application.ThreadException 来处理这类情况


    周雪峰
    2010年5月4日 5:32
    版主
  • System.Windows.Forms.Application.ThreadException 是针对于 Windows Forms 应用程序的。对于所有的 Windows Forms 程序,其主入口点都应该是单线程单元 (STA)。在这种方式下,ThreadException 事件仅处理 UI 线程上的未处理异常。其他线程上的异常无法被该事件处理。

    System.AppDomain.UnhandledException 发生在一个特定的 AppDomain 上。一个 AppDomain 包含多个程序集,而这些程序集又可能包含各种不同类型的程序,如 Console Application 或者 DLL。这个事件是 AppDomain 级别的,所有被当前 AppDomain 加载的程序集中的未处理异常,都能被处理。


    Mark Zhou
    2010年5月4日 7:35
  •  Thanks a lot!

    2010年5月10日 10:01
  • Profuse thanks.

    2010年5月10日 10:02
  • Not at All!
    周雪峰
    2010年5月12日 14:55
    版主