none
.net应用程序的异常捕获 和 区别. RRS feed

  • 问题

  • 首先是winform的,我知道可行的2个方法都是定阅事件,Application.ThreadException和currentDomain.UnhandledException
    那么他们有什么区别吗?

    其次是asp.net的,我在网上也找到了2个方法,一个是global.asax中的Application_Error方法,还有一个是使用实现了IHttpModule接口的类,类似:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9499
    这2个方法又有什么区别吗?
    2010年3月1日 8:26

答案

  • 你好!
         Application.ThreadException:
    在发生未捕获线程异常时发生。

    此事件允许 Windows 窗体应用程序处理 Windows 窗体线程中所发生的其他未处理异常。请将事件处理程序附加到 ThreadException 事件以处理这些异常,因为这些异常将使您的应用程序处于未知状态。应尽可能使用结构化异常处理块来处理异常。

    您可以通过设置 SetUnhandledExceptionMode 来更改是否将此回调用于未处理的 Windows 窗体线程异常。要捕捉不是由 Windows 窗体创建或拥有的线程中所发生的异常,请使用 UnhandledException 事件处理程序。

    AppDomain.UnhandleException:
    当某个异常未被捕获时出现。 此事件可以在任何应用程序域中进行处理。但在发生异常的应用程序域中不一定引发事件。仅当在没有找到合适的异常处理程序的情况下已展开线程的 整个堆栈时,才不会处理异常,因此可能引发事件的第一个位置是在生成该线程的应用程序域中。
    周雪峰
    2010年3月1日 9:15
    版主
  • 你好,

    个人认为在Application_Error方法中和自己实现IHttpModule进行error的捕捉基本没什么很大的区别。

    在applicaton的阶段有很多事件,事实上都是调用各种Module来进行处理的。

    如AuthenticationRequest是调用一个Authentication module(好像是这样的名字)来处理的。

    不过自定义的Modudle来处理error应该发生在application error处理之前
    Microsoft Online Community Support
    2010年3月3日 1:59

全部回复

  • 你好!
         Application.ThreadException:
    在发生未捕获线程异常时发生。

    此事件允许 Windows 窗体应用程序处理 Windows 窗体线程中所发生的其他未处理异常。请将事件处理程序附加到 ThreadException 事件以处理这些异常,因为这些异常将使您的应用程序处于未知状态。应尽可能使用结构化异常处理块来处理异常。

    您可以通过设置 SetUnhandledExceptionMode 来更改是否将此回调用于未处理的 Windows 窗体线程异常。要捕捉不是由 Windows 窗体创建或拥有的线程中所发生的异常,请使用 UnhandledException 事件处理程序。

    AppDomain.UnhandleException:
    当某个异常未被捕获时出现。 此事件可以在任何应用程序域中进行处理。但在发生异常的应用程序域中不一定引发事件。仅当在没有找到合适的异常处理程序的情况下已展开线程的 整个堆栈时,才不会处理异常,因此可能引发事件的第一个位置是在生成该线程的应用程序域中。
    周雪峰
    2010年3月1日 9:15
    版主
  • 谢谢,asp.net的呢
    2010年3月1日 9:38
  • 你好!
         具体可以参考:
    http://msdn.microsoft.com/zh-cn/library/fwzzh56s%28VS.80%29.aspx
    周雪峰
    2010年3月1日 9:54
    版主
  • 恩,这个我也知道,我想知道asp.net的两种方法的区别.thx

    2010年3月1日 10:22
  • 你好!
         实际上首先应该做的是使用try...catch结构来捕获异常,你上面提到的方法多数事件都是在异常已经发生的情况下使用的,这时程序处于未知状态,很可能已经没有办法恢复了,能做的只是记录这个异常,清理资源,然后关闭程序!
    周雪峰
    2010年3月1日 11:43
    版主
  • 你好,

    个人认为在Application_Error方法中和自己实现IHttpModule进行error的捕捉基本没什么很大的区别。

    在applicaton的阶段有很多事件,事实上都是调用各种Module来进行处理的。

    如AuthenticationRequest是调用一个Authentication module(好像是这样的名字)来处理的。

    不过自定义的Modudle来处理error应该发生在application error处理之前
    Microsoft Online Community Support
    2010年3月3日 1:59