使用错误页统一处理错误
2008-11-27 21:27
246 查看
我们在做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
}
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
}
相关文章推荐
- 使用错误页统一处理错误(转)
- 使用重写的$.ajax()统一错误处理
- SpringBoot进阶之使用异常替代返回错误码(拦截异常并统一处理)
- 在 MVVM 中使用 RACSubject 可以非常方便地实现统一的错误处理逻辑
- 详解Spring boot/Spring 统一错误处理方案的使用
- 使用onerror统一页面错误处理
- 使用Spring MVC统一异常处理实战
- 46. Spring Boot中使用AOP统一处理Web请求日志【从零开始学Spring Boot】
- 处理mysql使用in关键字子查询1317错误
- 使用统一服务名连接RAC数据库报ORA-12545错误
- 提高VS使用逼格的快捷键以及一些错误的处理方法
- Retrofit2使用CallAdapterFactory的错误处理
- 在Word 宏 VBA循环中使用on error的错误处理方法
- 产品有统一的错误处理机制和报错界面
- ELMAH (ASP.NET错误日志处理)使用方法
- MVC过滤器使用案例:统一处理异常顺道精简代码
- ASP.NET使用ORACLE数据库,游标超过最大数错误处理。
- 关于myeclipse WEB项目使用javabean方式整合jasperReport,Ireport设计模板,Linux错误处理,几天的研究心得
- Spring Cloud Spring Boot mybatis分布式微服务云架构(四十)使用AOP统一处理Web请求日志(1)
- asp.net 继承自Page实现统一页面验证与错误处理