ASP.NET中对Exception的统一集中处理常见的有两种方式的一些问题总结
来源:互联网 发布:淘宝开店需要钱? 编辑:程序博客网 时间:2024/06/04 18:12
ASP.NET中对Exception的统一集中处理常见的有两种方式:
1、通过配置Web.config的customErrors节点,配置defaultRedirect属性来实现所有“未处理的异常”均跳转向同一页面
2、通过Global.asax中的Application_Error写代码实现自己想要的操作
但在实际使用当中,往往会出现一些问题,比如Application_Error中的代码未被执行,如使用customErrors那么如何传递错误信息给目标页面等等。
通过我的摸索,总结出一些经验,记录如下:
1、不想通过配置Web.config中customErrors的方法进行页面跳转,而是希望在Application_Error中写代码进行一些处理然后用Response.Redirect方法跳转到指定页面,这种理论上很不错的方法实际上行不通!Application_Error中写Response.Redirect来跳转页面不会执行!
2、很多人不想使用配置Web.config实现出错自动跳转的原因无非是:跳转到了一个“死”链接,无法传递当前的错误信息过去,也就没办法进行相应的处理!其实这是一个误解,任何一个aspx网页都可以使用Server.GetLastError()获得最后一个异常,也可以使用this.Context.AllErrors获得全部的未处理异常,你配置的页面当然也可以,只要他是一个aspx页面就行。
//获得最近一个ExceptionException ex = this.Context.Server.GetLastError();//获得所有未处理的Exception集Exception[] errors = this.Context.AllErrors;//然后你可以对他们进行处理了
3、网上有人推荐使用Web.config和Application_Error结合的方式来处理异常可以吗?当然可以!但个人感觉这不是个好主意,因为没啥必要。
我们看一下他们会怎么干:
Web.config
<customErrors mode="On" defaultRedirect="Error.aspx">
Global.asax
protected void Application_Error(object sender, EventArgs e) { //获得最后一个Exception Exception ex = this.Context.Server.GetLastError(); //然后进行一系列处理,写文件日志,写数据库都行 //清除掉Exception,OK啦 this.Context.Server.ClearError(); }
Error.aspx
protected void Page_Load(object sender, EventArgs e){ //输出期望的错误页面}
这样看起来没问题吧,其实问题大了!你会发现它根本就不往Error.aspx页面跳转!为什么?因为Application_Error的处理优先级高于Web.config里面配置的自定义错误处理页面,你在Application_Error里面已经把所有该做的都做了,然后还把Error给Clear掉了,此时已经不会再触发Web.config里面配置的自动跳转了!
(
在http://blog.csdn.net/goodshot/article/details/8714584 中提到:备注:您可能注意到代码发出对 Server.ClearError 的调用。这将防止错误继续到要被处理的 Application_Error 事件中。
因此,"Page_Error"先于“Application_Error”先于“Web.config里面CustomError的配置”
)有人会说了,那我在Application_Error里面处理完之后不执行那个ClearError(),他不就跳转过去了吗?没错!这样一定是可以跳转的,而且你甚至可以在Error.aspx里面把这个错误再取出来一次,然后根据错误类型给用户一个“友好的”错误提示,最后别忘了再执行ClearError。这样是可以达到目的的,可是我真的觉得没必要,为什么没必要,看下面。
4、之所以有人采取3中的做法,无非是考虑到既想进行相应的错误捕捉处理,又想给用户一个“友好的”自定义界面。要达到这样的效果并不一定非得把两个结合起来,使用任意一种方法都能做到:
A、先看使用Web.config配置的方法:
Web.config
<customErrors mode="On" defaultRedirect="Error.aspx">
Error.aspx
protected void Page_Load(object sender, EventArgs e){
//获得最近一个ExceptionException ex = this.Context.Server.GetLastError();//然后你可以对他们进行处理了
}
B、使用Application_Error处理
Global.asax
protected void Application_Error(object sender, EventArgs e) { //获取Exception Exception ex = this.Context.Server.GetLastError(); //处理Exception //清除当前的输出 this.Context.Response.Clear(); //转向执行你希望展示给用户看的错误提示页面样子(此时网址依然是出错的那个页面,但是展示的内容就完全是你自己指定的页面了) this.Context.Server.Transfer("/Error.aspx"); }
- ASP.NET中对Exception的统一集中处理常见的有两种方式的一些问题总结
- ASP.NET中Application_Error对Exception的集中处理
- asp.net下载文件的集中方式
- ASP.Net中对时间的处理
- ASP.Net中对时间的处理
- Asp.Net中常见的问题(一)
- Asp.Net中常见的问题(二)
- spring中对异常的统一处理
- ASP.NET Routing对请求的处理方式
- 学习过程中对遇到的js 事件集中处理的个人白话总结
- asp.NET C#开发中的一些常见的问题集锦
- ASP.NET错误处理的方式(总结)
- ASP.NET错误处理的方式(总结)
- ASP.NET错误处理的方式(总结)
- ASP.NET错误处理的方式(整理&总结)
- ASP.NET错误处理的方式(总结)
- 在asp.net中对url地址统一编码的示例
- .Net 中ObjectDataSource 的Exception 处理
- Android CTS 测试总结【转】
- 什么是JQuery
- CUDA学习---(1) CUDA编程基本概念
- C# 文件操作 全收录 追加、拷贝、删除、移动文件、创建目录、递归删除文件夹及文件....
- 表格隔行换色
- ASP.NET中对Exception的统一集中处理常见的有两种方式的一些问题总结
- Matlab plot函数使用方法(详细)
- (转载)STM32-FSMC-LCD详解
- codeforces 285(Round #175)题解
- Hash算法
- C和C++中const的区别
- 学习jQuery必须知道的几种常用方法
- POJ 3130 半面相交
- ORA-00600: internal error code, arguments: [4194]解决方法