ASP.NET中对Exception的统一集中处理常见的有两种方式的一些问题总结

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页面就行。

//获得最近一个Exception
Exception 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)
{
//获得最近一个Exception
Exception 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");
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值