如何在ASP.NET请求生命周期中处理异常

如何在ASP.NET请求生命周期中处理异常,asp.net,exception-handling,error-handling,lifecycle,Asp.net,Exception Handling,Error Handling,Lifecycle,这个问题与ASP.NET请求生命周期中发生的异常有点相关,因为它涉及到如何最好地处理这些异常。我已经找到了一种优雅地处理大多数异常的方法,但后来我发现有些异常在请求中发生得太晚,以至于无法执行类似于Server.Transfer的操作。Transfer将整个错误表示逻辑比较到它自己的页面中 因此,我必须处理Application\u Error事件中的异常,并执行Response.Writes等等。很难看。我知道在某些情况下,响应流可能已经刷新,因此传输请求实际上不是一个选项。我想问的是,是否有

这个问题与ASP.NET请求生命周期中发生的异常有点相关,因为它涉及到如何最好地处理这些异常。我已经找到了一种优雅地处理大多数异常的方法,但后来我发现有些异常在请求中发生得太晚,以至于无法执行类似于
Server.Transfer的操作。Transfer
将整个错误表示逻辑比较到它自己的页面中

因此,我必须处理
Application\u Error
事件中的异常,并执行
Response.Write
s等等。很难看。我知道在某些情况下,响应流可能已经刷新,因此传输请求实际上不是一个选项。我想问的是,是否有人找到了这个问题的优雅解决方案

此外,我发现很难知道何时可以通过将请求转移到另一个页面而不是其他页面来优雅地处理异常。当异常发生时,找出请求生命周期中我们所处位置的最佳方法是什么?如果它发生在加载和呈现页面的过程中,
page\u Error
将能够处理它,并且我在执行
Server.Transfer
时还没有遇到问题。但是,如果异常发生得太早或太晚,以至于
页面错误
无法捕捉到它,并且它冒泡到
应用程序错误
,我该怎么做才能知道它是早还是晚

如果是在生命周期的后期,我可能必须执行
响应。直接从
Application\u Error
写入
,但如果是早期,我可以执行
Server.Transfer
。问题是,如果请求中的
太多,尝试执行Server.Transfer
本身将导致异常


那么,是否有一个全局枚举或类似的方法来指示对响应进行创造性处理是否为时已晚?

我认为我的建议是使用ASP.NET运行状况监视和WMI事件提供程序来处理错误:

下面是一个如何做的例子

希望这有助于:


Andrew

我使用这种方法来捕获在web控件或页面中生成的所有错误。它只需要从基类继承(一个用于页面,一个用于用户控件),每个页面或用户控件都可以实现自己的HandleException方法并执行它需要执行的任何操作。 完整代码如下:


我建议您使用asp.net配置为未处理的异常创建一个常规错误页面。从示例web.config

    <!--
        The <customErrors> section enables configuration 
        of what to do if/when an unhandled error occurs 
        during the execution of a request. Specifically, 
        it enables developers to configure html error pages 
        to be displayed in place of a error stack trace.

    <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
    -->

在整个处理程序上,只需记录异常,并让asp.net执行重定向


如果您仍然想继续使用您的客户方法,我建议您查看可用的asp.net源代码,并检查它是如何做到这一点的。

您好,谢谢您的建议。外部控制台应用程序并没有真正的帮助,因为我想要的不仅仅是捕获错误(我已经做得很好了),而且还显示一条友好的错误消息。您是否使用自定义错误页面?这允许您根据根据任何请求的结果抛出的任何Http状态代码显示自定义信息?ASP.NET将所有请求重定向到错误页(例如,而不是执行Server.Transfer),因此无法使用。ASP.NET的自定义错误完全没有用,因为它在物理上重定向(通过301或302响应代码)将用户发送到一个新的URL。基本的RESTful设计和常识表明,URL应该保持不变,以反映哪些资源失败;重定向完全破坏了这一点。