ASP.NET项目开发中的异常处理

前言:异常的处理在项目开发中是很有必要的,异常的处理不仅仅只是try..catch..finally就完事了的。异常处理绝对可以称开发中的重要组成部分。必须正确的面对异常,由于即使是最能干的开发职员,也要面对这个题目 ....


       我们不知道客户是怎么样使用我们开发的软件的,所以我们必须处理这样的情况:假如系统不按照我们的设计时所想的运行,我们改怎么办?

       下面我们就来具体的介绍在ASP.NET项目开发中的异常的处理方式,希望看完后,大家可以回答上面的题目。

       本篇的话题如下:

       应用程序级别异常处理的错误处理
       页面级别异常处理
       方法级别异常处理
       web.config文件异常处理配置
       健康监视(Health Monitoring)
       Enterprise Application Blocks异常处理模块


  勇敢和必胜的信念常使战斗得以胜利结束。 —— 恩格斯

      一.在应用程序级别的异常处理:
       相信大家对Application对象不陌生,而且在项目中添加过Global.asax文件。确实,ASP.NET在应用程序级别处理异常的代码都是放在Global.asax的Application_Error事件处理下的:
   void Application_Error(object sender, EventArgs e)(// Code that runs when an unhandled error occurs}

           我们可以在上面的事件处理的方法中捕捉所有的异常,而且还可以把异常记录到日志文件,并且同时发送Email告诉开发职员出现了什么题目,
如下:
<Code>:
当然,上面的代码要正确的运行,我们海必须在Global.asax中加入相应的命名空间,而且在发送邮件的时候,上面的&quot;127.0.0.1&quot;要换为我们自己的邮件服务器的地址:

<%@ Import Namespace=&quot;System.Diagnostics&quot; %>
  <%@ Import Namespace=&quot;System.Net.Mail&quot; %>

    还有一点要留意的就是,ASP.NET运行时是以ASPNET账户运行的,这个账户的权限是有限的,假如我们想要使得上面的代码可以运行,那么就必须要给ASPNET账户访问注册表的权限。假如你不给权限,那么上面的代码就报错。


       我们赋予ASPNET账户访问在&quot;HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlog&quot;节点以及字节点的权限。
       下面就讲讲如何配置权限:
       1.打开&quot;运行&quot;菜单
       2.输入&quot;regedit&quot;,然后确定
       3.导航到&quot;HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlog&quot;节点。
       4.右击这个节点,并且选择&quot;权限&quot;,此时就会弹出权限配置的窗口。
       5.点击&quot;添加&quot;,在弹出的窗口中点击&quot;高级&quot;,之后再点 击&quot;查找&quot;,最后在下面的窗口找到&quot;ASPNET&quot;账户,确定。
       6.最后给予ASPNET账户读的权限就OK了。

       上面的代码,假如我们不在最后加了Response.Redirect方法,出错后,用户看到的就是那个很经典的黄颜色的报错的页面。我们也知道,那个经典的报错页面会暴露很多的信息,所以我们经常导航到我们自定义的错误页面。





       二.页面级的异常处理


       除了在Global.asax中编写处理代码,我们还可以在页面的Page_Error中编写代码:

  public void Page_Error(object sender, EventArgs e)
    {//Insert same code that is in the Application_Error event. }

      假如在该页面中发生了错误,那么页面中的上面的那段代码就会执行,我们可以把之前写在Application_Error事件中的代码全部copy到 Page_Error处理方法中。但是,假如这样,那么我们的Application_Error中的代码就不运行了,由于异常已经在之前,也就是 Page_Error中被处理了。

       三 方法级别的处理
       相信这点大家非常的熟悉了,就是常见的try..catch..finally语句块的运用,这里不赘述。

       四 web.config配置

      我们处理异常一般在web.config文件中配置 <customErrors />节点:

<customErrors mode=&quot;RemoteOnly&quot; defaultRedirect=&quot;ErrorPage.aspx&quot;>
  <error statusCode=&quot;403&quot; redirect=&quot;NoAccess.htm&quot; />
  <error statusCode=&quot;404&quot; redirect=&quot;FileNotFound.htm&quot; />
  </customErrors>

节点中的一些属性,大家也应该很熟悉,我不罗嗦了。

       五 健康监视(Health Monitoring)

       Health Monitoring是ASP.NET2.0以后版本添加的新的特性。它可以答应开发职员监视应用程序中发生的异常的事件。而且监视应用程序的启动,封 闭,验证等都有相对应的事件来监视。而且我们还可以创建自定义的事件来监视应用程序中的特定的部分。我们也可以在Health Monitoring中配置把应用程序中的异常是记录在系统的日志中还是Sql Server中,或者是以Email形式发送出去。最重要的一点就是:只要通过配置,我们可以少写,甚至不写代码就可以实现强大的异常处理策略(和类似 Enterprise Application Blocks,我们后面会提到的)。


       同样,我们还是在web.config中添加配置,在system.web节点中添加<healthMonitoring />节点:

       默认情况下是禁用的,我们启用就应该如下:

      +Code

          下面就看看该节点下的一些配置:
       eventMappings节点通过指定事件类型来注册事件类。也就说,要注明我们在应用程序中要监听哪些事件,如下配置:

       <eventMappings>
              <clear />
              <add name=”CustomException” type=”System.Web.Management.WebBaseErrorEvent” />
              </eventMappings>

               前面的&quot;name&quot;属性是我们自己为后面的事件取的友好的名称,从<eventMappings>的字面意思也可以知道:事件的映射。
       后面的&quot;type&quot;就是我们要在程序中监听的事件。之前也说过,我们可以监听很多的事件:系统的启动,封闭,验证失败等。

       如上所见:&quot;System.Web.Management.WebBaseErrorEvent&quot; 是所有事件的基类。它的子类有很多:

       WebApplicationLifetimeEvent--在应用程序的运行过程触发的事情,如,当应用程序开启,封闭时
       WebAuthenticationFailureAuditEvent--当ASP.NET验证失败是触发
       WebAuthenticationSuccessAuditEvent--验证成功时触发
       WebRequestErrorEvent--请求出错时触发

       除此之外,我们还可以自定义一些类,派生自基类。


       当我们确定了要监听的事件之后,我们就要选择事件的provider,也就说,事件触发后,我们把事情的信息记录到那里。
       配置如下:

       <providers>
              <clear />
              <add name=”EventLogProvider” type=”System.Web.Management.EventLogWebEventProvider” />
              </providers>

       这之前一样:System.Web.Management.EventLogWebEventProvider是个基类,有很多的子类,这些子类可以使得我们把异常的记录在如sql数据库中,系统日志中等:
       SqlWebEventProvider--把异常信息记录到数据库中的提供程序
       SimpleMailEventProvider--把异常信息通过Email发送的提供程序

       还有一些,大家参看MSDN。

       好了,到这里,我们把要监听的事件选择好了,如要监听 WebApplicationLifetimeEvent,WebRequestErrorEvent;而且我们也预备把异常系统通过Email发送,我 们选择了SimpleMailEventProvider,通过也想把异常记录到数据库中,我们也选择了SqlWebEventProvider。那么我 们的配置就如下:

+Code:

   <healthMonitoring enabled=”true>
   <eventMappings>
   <clear />
   <add name=”CustomException” type=”System.Web.Management.WebApplicationLifetimeEvent” />
   <add name=”AnotherException&quot; type=”System.Web.Management.WebRequestErrorEvent” />
   </eventMappings>

  <providers>
   <clear />
   <add name=”EmailProvider” type=”System.Web.Management.SimpleMailEventProvider” />
   <add name=”SqlProvider” type=”System.Web.Management.WebRequestErrorEvent” />
   </providers>
  
   </healthMonitoring>



         留意:providers节点中的&quot;name&quot;属性也是我们自己取的友好的名称。

       好了,该定义的定义好了,现在还是不能按照我们的要求工作,那是由于我们还缺少一个&quot;规则&quot;:
如下:

+Code:

留意上面的name属性,实在和之前一样,我们是给这个规则取个名字而已。eventName就是之前我们定义的事件名称, 如&quot;CustomException&quot;,provider为之前定义的“EmailProvider” ,本条规则就是说,让EmailProvider来处理CustomException的异常信息。其他的同理。

       最后一点要留意的就是:假如我们决定发送Email,那么我们还要配置节点:

  <system.net>
    <mailSettings>
    <smtp deliveryMethod=”PickupDirectoryFromIis”>
    <network defaultCredentials=”true” host=”127.0.0.1” />
    </smtp>
    </mailSettings>
    </system.net>


       这样就行了。



       六 Enterprise Application Blocks

      关于Enterprise Application Blocks,相信大家都知道,在异常处理的时候我们一般用Exception Handling Application Block(后面简称 :异常处理的模块),Logging Application Block。
       在决定用Enterprise Application Blocks的时候,我们必须首先下载安装包.
       得到了安装包之后,我们就开始安装,假如在安装的过程中,全部采用默认的安装设置,那么我们就会有c:EntLib4SrcQuick Starts文件夹。而且在ExceptionHandlingCS子文件夹下有 ExceptionHandlingBasicQuickStart.sln 和ExceptionHanldingWithLoggingQuickStart.sln。打开 ExceptionHandlingWithLoggingQuickStart解决方案,这个方案是个告诉我们假如使用异常处理模块的Demo。


       而且这个Demo是WinForm的,由于我们谈的是在ASP.NET使用异常处理的模块。所以我们谈谈在ASP.NET如何使用。
       在此之前,我们要熟悉一些配置节点,实在这些节点的结构和我们之前谈的&quot;健康监视&quot;很相似:

  <exceptionTypes>
   <add name=”Exception” type=”System.Exception, mscorlib, Version=2.0.0.0,
   Culture=neutral, PublicKeyToken=b77a5c561934e089” postHandlingAction=”None”>
   </exceptionTypes>

       上面节点表示要处理的异常,和之前的<eventMappings>相似。

  <exceptionHandlers>
   <add name=”Application Message Handler” type=”ExceptionHandlingQuickStart.AppMessageExceptionHandler,
   ExceptionHandlingWithLoggingQuickStart”/>
   </exceptionHandlers>

       异常处理模块,就是异常发生后,如何处理。和之前的providers节点类似。

       下面的节点,看起来很吓人的,实在是声明异常信息以什么格式记录:

+Code
       最后的节点如下,也不难理解,和之前说的rules节点类似:
            
+Code

实在Enterprise Application Blocks的功能不仅强大,而且还有最大的好处就是可以用GUI图形化的形式来配置,不必项之前一样要亲安闲配置文件中写配置。而且在代码调用方面也很简单,几句话就OK了。


       说完上面的之后,我们就用图文结合的方式,展示如何使用异常处理模块。      


       首先,我们把Program FilesMicrosoft Enterprise Library 4.1 - October 2008in目录下的几个dll引入到我们的ASP.NET项目中:
    Microsoft.Practices.EnterpriseLibrary.Common
       Microsoft.Practices.EnterpriseLibrary.ExceptionHandling
       Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging
       Microsoft.Practices.EnterpriseLibrary.Logging
       Microsoft.Practices.ObjectBuilder2

       下面开始配置:


       1.在我们的ASP.NET项目的web.config文件上点击右键,就会弹出&quot;Edit Enterprise Library Configuration&quot;选项。点击后就会看见如下界面:                                                                                                

       2.在弹出的界面中选中&quot;web.config&quot;,点击右键 &quot;新建&quot;-&quot;Logging Application Block&quot;,这样就把添加了日志记录的模块的节点,如下:

       3.在默认情况下,在event log 的 trace listener节点有一个Trace Listeners,由于我们要发送Email,所以要添加个e-mail trace listener。在Trace Listeners点击右键,&quot;新建&quot;-&quot;Email Trace Listener&quot;,之后就添加了&quot;Email TraceListener&quot;节点,然后选中&quot;Email TraceListener&quot;,查看属性,可以设置发送Email的设置。如图:
并且设置Formatter属性并且选择&quot;Text Formatter&quot;,设置信息格式为文本的形式。


       4.现在点击&quot;web.config&quot;添加异常handler。&quot;新 建&quot;-&quot;Exception Handling Application Block&quot;,如下:

       然后在&quot;Exception Handling Application Block&quot;上右击&quot;新建&quot;-&quot;Exception Policy&quot;,然后我们可以重新命名为&quot;MyPolicy&quot;.然后 在&quot;MyPolicy&quot;上右键,选中&quot;New Exception Type&quot;,然后选择我们要处理的异常,如图:


       我们一般是选择默认设置:处理所有异常。

       好了,现在我们把事件的处理程序也添加了,那么下面就要加类似于&quot;rules&quot;的设置。

       5.在&quot;Exception&quot;节点上右击&quot;新 建&quot;-&quot;Logging Handler&quot;,然后选择&quot;Logging Handler&quot;节点,并且展开,选中&quot;FormatterType&quot;,展开并且 选&quot;TextExceptionFormatter&quot;,最后确认就OK了。如下:




       6.然后在点击&quot;Logging Application BlockSpecial SourceAll Events&quot;的那个节点,右击&quot;新建&quot;-&quot;Trace Listener Reference&quot;添加&quot;Trace Listener Reference&quot;,并且设置&quot;ReferencedTrace Listener&quot;属性为&quot;Email Trace Listener&quot;,最后保存就行了。

   7.我们在Global.asax文件下添加引用:

<%@ Import Namespace=”Microsoft.Practices.EnterpriseLibrary.ExceptionHandling” %>

       添加代码:

void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
  ExceptionPolicy.HandleException(Server.GetLastError(), “Global Policy”);
}

       就行了,强大异常处理就成功了。



       今天到这里,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值