ASP
NET应用可以再代码中利用异常捕获来处理错误(try
catch)但是应用出现的所有错误
都用异常捕获来处理是一种不良的编程习惯
try
catch使用简单
但是过度使用会导致严重的性能损失
如果能检测可能出现不预期情况
应该尽量使用其他方法
而将异常捕获作为最后考虑的手段
异常捕获是NET官方提供应用程序处理工具
如果ASP
NET应用程序出现异常
运行时会试图寻找有意捕获它的代码块
异常会在栈中下上遍历
直到抵达当前应用程序的起始层
如果在这期间没有找到合适的处理程序
该异常便成为未处理异常
并使CLR抛出系统异常
用户会看见报黄页
应用程序也会随即终止
默认的错误页面用户在本地和远程计算机看到的典型错误页面是不一样的
本地用户会看到相对详细的错误信息远程用户接收到的信息不会那么详细主要是出于安全方面考虑
ASPNET提供了两级全局拦截点分别位于页面级和应用程序级帮助我们以编程的方法处理错误基于基类Page暴露了Error事件我们可以在页面中重写它捕获页面执行期间引发的未处理异常同样HttpApplication类中也有Error事件用于捕获整个应用程序中抛出的异常
页面级错误处理
protected override void OnError(EventArgs e)
{
Exception ex = ServerGetLastError()
if(ex is NotImplementedException)
ServerTransfer(errorpages/notImplementedaspx)
else
ServerTransfer(errorpages/apperroraspx)
ServerClearError()
}
通过Server对象的GetLastError方法我们获得被引发的异常然后传到特定的页面展示给用户最后一旦异常处理完成应用调用ClearError清楚错误
全局错误处理
页面的Error事件处理能够捕获特定页面的错误如果要使组合应用程序的所有页面共享一套错误处理代码我们可以在应用程序级创建一段全局错误处理程序便可捕获所有未处理异常实现几乎和页面级的错误处理程序一样只不过处理的是代表整个应用程序的HttpApplication对象中的Error事件为此我们需要将globalasax文件添加到程序中并定义Application_Error方法
protected override void OnError(EventArgs e)
{
Exception ex = ServerGetLastError()
if(ex is NotImplementedException)
ServerTransfer(errorpages/notImplementedaspx)
else
ServerTransfer(errorpages/apperroraspx)
ServerClearError()
}
错误的页面映射
当未处理异常抵达调用栈末端时ASPNET会报黄页但是我们还可以通过使用应用程序WebConfig文件中的<customErrors>区段可以对这个功能进行充分的控制
<configuration>
<systemweb>
<customErrors mode=Off>
</customErrors>
</systemweb>
</configuration>
mode属性用于决定错误消息是启动关闭还是只显示给远程客户端
当mode设为RemoteOnly时远程用户会收到一般性的错误提示页面而本地可以得到详细的错误信息
当mode设为off时本地和远程用户都会显示包含详细错误的页面
可以自定义错误页面
<configuration>
<systemweb>
<customErrors mode=Off defaultRedirect=>
</customErrors>
</systemweb>
</configuration>
如果mode为on时本地和远程都将会把defaultRedirect=页面来代替原来的错误报黄页面为用户展示友好的错误提示大多数自定义的错误页面时纯HTML编写的
常见的HTTP错误处理
ASPNET还使我们能够针对发生的不同HTTP错误显示相应的自定义页面错误页面和特定HTTP状态之间的映射可以定义在<customErrors>区段设置<error>标签将HTTP状态码
和自定义错误页面关联起来
<configuration>
<systemweb>
<customErrors mode=Off defaultRedirect=>
<error statusCode= redirect=/>
<error statusCode= redirect=/>
</customErrors>
</systemweb>
</configuration>