ASP.NET的错误处理机制

       对Web应用程序来说,发生不可预知的错误和异常在所难免,我们必须为Web程序提供错误处理机制。当错误发生时,我们必须做好两件事情:一是将错误信息 记录日志,发邮件通知网站维护人员,方便技术人员对错误进行跟踪处理;二是以友好的方式提示最终用户页面发生了错误,而不能将未处理的错误信息显示给用 户。

  让我们想想,ASP.NET为我们提供了几种错误处理机制?如果同时使用他们是不是有一定的优先级?.NET提供了四种错误处理机制,它们有一定的优先级顺序:Page_Error事件>ErrorPage属性>Application_Error事件> <customErrors>配置项。下面分别介绍这四种错误处理机制的用法。

  1.Page_Error事件
  Page_Error 事件提供一种捕获在页级别出现的错误的方法。您可以只是显示错误信息(正如下面的示例代码所示),也可以记录事件或执行某个其他操作。
复制代码
代码
 1   private void Page_Load(object sender, System.EventArgs e)
 2   {
 3   // Put user code to initialize the page here
 4   throw new Exception("Page Error!");
 5   }
 6 
 7   protected void Page_Error(object sender, EventArgs e) 
 8   {
 9   Exception objErr = Server.GetLastError().GetBaseException();
10   Response.Write("Error:" + objErr.Message);
11   Server.ClearError(); //同样要注意这句代码的使用
12 
13   }
14 
复制代码

备注:此示例在浏览器中显示详细的错误信息,提供此示例只是为了进行说明。向应用程序的最终用户显示详细信息一定要小心。更适当的做法是向用户显示一条消 息,告知已发生错误,然后将具体的错误详细信息记录在日志中。

 

  2.ErrorPage属性
  你几乎可以在页面任何时候设置ErrorPage属性,从而确定页面发生错误的时候会重定向至哪个页面。要让ErrorPage属性能够发挥作 用,<customErrors>配置项中的mode属性必须设为"On"。
  this.ErrorPage = "~/ErrorHandling/PageError.html";
  如果Page_Error和ErrorPage都存在,当抛出Exception时,页面执行顺序是怎样的呢?页面会先执行Page_Error事件处理 函数,如果Page_Error()事件中调用函数Server.ClearError()清除异常信息,则不会跳转到ErrorPage属性指定页面; 如果没有调用Server.ClearError(),Exception信息会继续向上抛,页面会跳转到ErrorPage指定页面。这也就证明了优先 级顺序:Page_Error事件>ErrorPage属性。

  3.Application_Error事件
  与Page_Error 事件相类似,您可使用Application_Error事件捕获发生在应用程序中的错误。由于事件发生在整个应用程序范围内,因此您可记录应用程序的错 误信息或处理其他可能发生的应用程序级别的错误。在Global.asax文件中添加如下代码就OK了。
复制代码
代码
 1 protected void Application_Error(object sender, EventArgs e)
 2   {
 3   Exception ex = Server.GetLastError().GetBaseException();
 4   //实际应用中这里可以将Exception信息记Log或是保存到数据库中
 5   //还可以将错误发邮件给网站维护人员
 6   Response.Write("Error:" + ex.Message);
 7   //清除Exception,避免继续传递给上一级处理
 8   //这里上级就是<CustomerErrors>配置节了
 9   Server.ClearError(); 
10   }
复制代码

  4.<customErrors>配置项
  配置文件web.config中的<customErrors> 配置节,可将重定向页指定为默认的错误页defaultRedirect或者根据引发的 HTTP 错误代码指定特定页。如果发生在应用程序以前的任一级别都未捕获到的错误,则显示这个自定义页。
<customErrors mode="On" defaultRedirect="~/ErrorHandling/ApplicationError.html">
  <error statusCode="404" redirect="~/ErrorHandling/404.html" />
</customErrors>  
  同样,如果Application_Error和<customerErrors>同时存在,也存在执行顺序的问题。因为优先级 Application_Error事件> <customErrors>配置项,所以发生应用程序级错误时,优先执行Application_Error事件中的代码,如果 Application_Error事件中调用了Server.ClearError()函数,<customerErrors>配置节中的 defaultRedirect不起作用,因为Exception已经被清除;如果Application_Error事件中没用调用了 Server.ClearError()函数,错误页会重新定位到defaultRedict指定的URL页面,为用户显示友好出错信息。

  通过对.NET提供的以上四种错误处理机制的分析,我们可以把它们从不同的角度分类,便于我们理解和使用。
  1.从功能上分类:用于异常处理(Handling exceptions)是Page_Error事件和Application_Error事件;用户错误页面重定向(Redirecting the user to an error page)的是 ErrorPage属性 和 <customErrors>配置项。
  2.从错误处理的范围分类:用于页面级(Page level)错误处理的是Page_Error事件 和 ErrorPage属性;用于应用程序级(Application level)错误处理的是Application_Error事件 和 <customErrors>配置项。 

 请注意,<customErrors> 部分包括设置为 On 的 mode 属性。mode 属性用于控制错误重定向发生的方式。例如,如果您正开发应用程序,则很可能希望查看实际的 ASP.NET 错误信息,并且不希望被重定向到更用户友好的错误页。mode 属性包括以下设置:? On:未被处理的异常将用户重定向到指定的 defaultRedirect 页。此模式主要用于生产。 
? Off:用户收到异常信息而不是被重定向到 defaultRedirect 页。此模式主要用于开发。 
? RemoteOnly:只有在本地计算机上访问该站点的用户(通过使用 localhost)才能收到异常信息。所有其他用户都被重定向到 defaultRedirect 页。此模式主要用于调试。  
posted @   zhwily  阅读(318)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示