我们在做Asp.net应用程序的时候,通常在每个页面都要处理错误,这样一来即浪费了时间还不易于维护!在一个错误页中统一处理未知异常,是一个很好的办法!
Asp.net 提供<customErrors>配置节提供了一个解决办法,使用方法如下:
<system.web>
<customErrors defaultRedirect="~/ErrorPage.aspx"
mode="RemoteOnly">
</customErrors>
</system.web>
defaultRedirect属性用来指明当aspx页面发生了未处理错误时导向的页面(由用户自己定义),Asp.net会在导向错误页时在错误页面的地址后面加上出现异常页面的地址。~/代表应用程序根目录,mode属性的用法请查msdn,不再赘述!这样我们就可以在ErrorPage页面中使用Server.GetLastError()方法来获得最近一次发生的异常了,然后进行写日志及提示用户等操作。
想法虽好,实现起来有问题。为什么呢?因为Asp.net使用重定向机制来重新导航的错误页面,这样错误信息就会丢失,也就是说我们用Server.GetLastError()获得的Exception对象始终是空的。因此我们可以提示用户出错,并提供一个返回出错页面的链接,却不能给我们自己一个很好的答复。
幸好天无绝人之路,我又找到了另一种方法,如果我们在第一时间得到页面出错信息,然后使用Server.Transer()方法导航到错误页,不就可以得到错误信息了吗!做法如下:
在Global.asax文件中撰写如下代码:
protected void Application_Error(Object sender, EventArgs e)
{
Server.Transfer("~/ErrorPage.aspx");
}
这样我们在错误页中就可以做如下处理了:
//得到最新的异常信息,我们得到的异常类型为HttpUnhandledException,是真正错误的一个包装,
//至于Asp.net为什么这么做,我也不是很清楚
Exception exp = Server.GetLastError();
if(exp != null)
{
this.lblErrorMessage.Text = "您查看的页面出错了,请与管理员联系";
//内部异常中保存这本次错误的详细信息
if(exp.InnerException != null)
{
//写异常日志,自己定义的方法
WriteExceptionLog(exp.InnerException);
}
//清除我们已经处理的异常,以免不小心重复处理。
Server.ClearError();
}
好了,事情总算完成了,仔细一看,大跌眼镜,在两种方法下,比较出错页面的地址栏就知道为什么了。造成这个问题的原因在于Server.Transfer()与Response.Redirect()方法执行方式的不同。我也没招了,解决成这样差强人意,如果有更好的办法请你告诉我。
现在已经找到了合适的处理方式了::
可以在Global.asax文件中写错误处理代码,可以避免以上问题:
protected void Application_Error(Object sender, EventArgs e)
{
//Log.Write ,write sth
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gentle_wolf/archive/2008/11/27/3394418.aspx