【asp源码栏目提醒】:网学会员在asp源码频道为大家收集整理了“ASP.NET异常处理 - 文化教育“提供大家参考,希望对大家有所帮助!
3.5 Web应用的异常处理 为什么要进行异常处理 try-catch异常处理块 页面级的Page_Error事件处理异常 页面级的ErrorPage属性处理异常 应用程序级异常处理 配置应用程序的异常处理 3.5.1 为什么要进行异常处理 对于一个Web应用程序来说,出错是在所难免的。
当应用程序发布后,可能由于代码本身的缺陷、
网络 故障或其它问题,导致用户请求得不到正确的响应, 出现一些对用户而言毫无意义的错误信息,甚至泄漏 了一些重要信息,让恶意用户有了攻击
系统的可能。
当错误发生时,必须做好两件事情: 一是将错误信息记录日志,发邮件通知网站维护 人员,方便技术人员对错误进行跟踪处理; 二是以友好的方式提示最终用户页面发生了错 误,而不能将未处理的错误信息显示给用户。
ASP.
NET提供了5种异常处理机制(优先 级别从高到低): 通过try-catch异常处理块处理异常。
通过页面级的Page_Error事件处理异常。
通过页面级的ErrorPage属性处理异常。
通过应用程序级的Application_Error事件 处理异常。
通过配置应用程序配置 项处理异常。
3.5.2 try-catch异常处理块 【例3-11】演示try-catch异常处理块的使 用。
3.5.3 页面级的Page_Error事件处理异常 Page类有个异常处理事件(Page_Error),当 页面引发了未处理的异常时触发该事件。
因此, 可在该事件中添加代码处理页面中发生的未处理 异常。
【例3-12】演示如何使用页面级的Page_Error事 件处理异常。
3.5.4 页面级的ErrorPage属性处理异常 通过设置页面的ErrorPage属性,可以让页面发生 错误的时候重定向至友好的错误描述页面。
例如, this.ErrorPage /Error.htm。
注意,要让 ErrorPage属性发挥作用,web.config文件中的 配置项中的mode属性必须设为 On。
【例3-13】
演示如何使用页面级的ErrorPage属性 处理异常。
注意:如果Page_Error和ErrorPage都存在, 当该页抛出异常时,页面执行顺序是怎样的 呢? 页面会先执行Page_Error事件处理方法,如果 Page_Error事件中调用Server.ClearError 方法清除异常信息,则不会跳转到ErrorPage 属性指定页面;如果没有调用 Server.ClearError,异常信息会继续向上 抛,页面会跳转到ErrorPage指定页面。
3.5.4 应用程序级异常处理 与Page_Error事件相类似,可以使用Global.asax 文件中的Application_Error事件捕获发生在应用 程序中的所有未处理的异常。
由于在整个应用程序范围内发生异常,并且都没有 使用前面的方法处理这些异常,则会触发 Application_Error事件处理这些应用
程序级别的 错误。
【例3-14】演示如何使用Application_Error事件捕获发生在应用程序中所有未处理的异常,并将捕获的异常信息写入Windows事件日志。
3.5.5 配置应用程序的异常处理 如果既没有设置页面级异常处理,也没有设置应用程序级异常处理,那 么还可以通过在配置文件web.config中设置配置来处理整个应用程序中 未处理的异常。
具体方法是修改应用程序根目录下的
web.config文件,在system.web 下面对customErrors元素进行以下更改: 上述代码中,mode用于设置错误页面的显示模式,有如下3个可选项。
RemoteOnly:如果应用程序发生未处理的异常,则对远程用户显示一个通用的错误 页面,对本地用户将显示详细的错误页面。
Off:如果应用程序发生未处理的异常,无论请求是本地还是远程,对所有用户都显示 详细的错误信息。
On:如果应用程序发生未处理的异常,无论请求是本地还是远程,对所有用户都显示 通用的错误信息。
如果Application_Error和同 时存在,也存在执行顺序的
问题。
因为 Application_Error事件优先级高于 配置项,所以发生应用程序级错 误时,优先执行Application_Error事件中的代 码,如果Application_Error事件中调用了 Server.ClearError函数,则 配置节中的defaultRedirect不起作用,因为异常 已经被清除;如果Application_Error事件中没用 调用Server.ClearError函数,则会重新定位到 defaultRedict指定的URL页面,为用户显示友好 出错信息。
谢谢大家!