ASP.NET应用可以再代码中利用异常捕获来处理错误(try、catch)但是应用出现的所有错误,都用异常捕获来处理是一种不良的编程习惯。try、catch使用简单,但是过度使用会导致严重的性能损失。如果能检测可能出现不预期情况,应该尽量使用其他方法,而将异常捕获作为后考虑的手段,异常捕获是NET官方提供应用程序处理工具。如果ASP.NET应用程序出现异常,运行时会试图寻找有意捕获它的代码块,异常会在栈中下上遍历,直到抵达当前应用程序的起始层,如果在这期间没有找到合适的处理程序,该异常便成为未处理异常,并使CLR抛出系统异常,用户会看见报黄页,应用程序也会随即终止。

  默认的错误页面用户在本地和远程计算机看到的典型错误页面是不一样的。

  本地用户会看到相对详细的错误信息,远程用户接收到的信息不会那么详细。主要是出于安全方面考虑。

  ASP.NET提供了两级全局拦截点,分别位于页面级和应用程序级,帮助我们以编程的方法处理错误。基于基类Page暴露了Error事件,我们可以在页面中重写它,捕获页面执行期间引发的未处理异常。同样,HttpApplication类中也有Error事件,用于捕获整个应用程序中抛出的异常。

  页面级错误处理

protected override void OnError(EventArgs e)
{
    Exception ex = Server.GetLastError();
    if(ex is NotImplementedException)
        Server.Transfer("errorpages/notImplemented.aspx");
    else
        Server.Transfer("errorpages/apperror.aspx");
    Server.ClearError();
}

  通过Server对象的GetLastError方法,我们获得被引发的异常。然后传到特定的页面,展示给用户。后一旦异常处理完成,应用调用ClearError清楚错误。

  全局错误处理

  页面的Error事件处理能够捕获特定页面的错误,如果要使组合应用程序的所有页面共享一套错误处理代码,我们可以在应用程序级创建一段全局错误处理程序,便可捕获所有未处理异常。实现几乎和页面级的错误处理程序一样,只不过处理的是代表整个应用程序的HttpApplication对象中的Error事件,为此,我们需要将global.asax文件添加到程序中,并定义Application_Error方法:

protected override void OnError(EventArgs e)
{
    Exception ex = Server.GetLastError();
    if(ex is NotImplementedException)
        Server.Transfer("errorpages/notImplemented.aspx");
    else
        Server.Transfer("errorpages/apperror.aspx");
    Server.ClearError();
}

  错误的页面映射

  当未处理异常抵达调用栈末端时,ASP.NET会报黄页,但是我们还可以通过使用应用程序Web.Config文件中的<customErrors>区段,可以对这个功能进行充分的控制。

<configuration>
    <system.web>
        <customErrors mode="Off">
        </customErrors>
    </system.web>
</configuration>