2012年3月19日星期一

ASP.NET 错误处理模块

异常可以通过try catch捕捉到,但是难免有几个忘记catch的,这样会导致页面出现500等错误,在本机还是可以看到错误信息,但如果已经上线,抛出的异常又不会让用户看到,想处理,可以去windows日志里面看,还可以加一个module,将异常信息捕捉到,并发给相关人士。

 

创建一个项目,添加一个类ErrorReporterModule,继承自IHttpModule,实现2个方法。void Init(HttpApplication context)和void Dispose()

 

在Init下加入如下代码:

   1:  context.Error += (object sender, EventArgs e) =>
   2:                  {
   3:                      HttpContext ctx = HttpContext.Current;
   4:                      HttpRequest request = ctx.Request;
   5:                      Exception exception = ctx.Server.GetLastError();
   6:   
   7:                      HttpErrorMessage message = new HttpErrorMessage()
   8:                      {
   9:                          Message = exception.Message,
  10:                          StackTrace = exception.StackTrace,
  11:                          Source = exception.Source,
  12:                          HelpLink = exception.HelpLink,
  13:                          RequestForm = request.Form,
  14:                          RequestParam = request.Params,
  15:                          RequestUrl = request.Url.ToString(),
  16:                          QueryString = request.QueryString,
  17:                          Cookies = request.Cookies
  18:                      };
  19:                      container.Resolve<ErrorRecorder>().Record(message);
  20:                      ctx.Server.ClearError();
  21:                  };

剩下的就是处理这些异常了,主要的错误信息就在Exception里面,出错时的环境则在request里面。

处理抛出的异常可以用文本记录方式也可以存入数据库,但是这些处理都很被动,开发人员要不定时去查看这些信息才可以看到。当然我们也可以配置一个邮件服务,将这些错误信息主动发送到开发人员手中。

我们也可以配置相关的处理人员,这样可以根据不同的站点,发送到对应的开发、测试那里。

NEXT:配置web.config

在web.confg中加个:

<httpModules>
  <add name="ErrorReporterModule" type="Symbol.Web.Mvc.Modules.ErrorReporterModule"/>
</httpModules>

就可以了,

II7的经典模式是和II6一样的,就是对IIS6的兼容。

但是在II7中的集成模式,我们还需要在system.webServer中加一次。

 

最后记录一下idea:

1.配置对应的模块开发人员,哪个模块出错了就那个人员去跟进

2.设置一个定时任务,如一个礼拜导出一个异常报告

3.配置多种发送模式,文本、数据库、邮件。。。

4.分辨不同的异常,像404之类的很可能是用户打错URL,这个就不需要发送了


ASP.NET 错误处理模块

TAG: