在我们写程序时偶尔会由于疏忽导致有些异常没有进行处理如果将异常详细信息提示给用户会带来不安全因素如果不提示详细信息又会给用户报告异常带来麻烦虽然可以通过配置customErrors mode来实现只有管理员可以查看错误但发现问题的时间可能会比较长通过全局异常处理就可以在异常发生时立即记录异常或直接发送邮件向管理员报告以在最快的速度发现并处理异常
要为ASPNET应用程序添加全局异常处理主要是添加HttpApplication的Error事件的处理这与在BeginRequest事件中进行URL重写方法类似先建一个继承SystemWebIHttpModule的类然后添加Init方法和ShowError方法
namespace Snowdream
{
public class HttpModule : SystemWebIHttpModule
{
public void Init(SystemWebHttpApplication context)
{
contextError += new EventHandler(ShowError);
}
private void ShowError(object sender EventArgs e)
{
//在这里进行异常处理
}
}
}
然后还需要配置webconfig的httpModules使之生效
我现在比较喜欢的做法是将异常的详细信息记录在数据库中然后返回一个编号再将页面重定向到自己写的错误提示页将这个编号提示给用户用户如果要报告错误只需提供该错误编号管理员就能在后台中找到错误的详细信息并进行修改
下面说个我在做全局异常处理时碰到的问题及我的解决方案
第一个是获取异常hResult由于是私有属性不能直接访问解决方法是通过(int)SystemRuntimeInteropServicesMarshalGetHRForException(exception)来获取
第二个问题是记录了很多不是由于ASPNET应用程序引发的错误比如用户键入一个错误的URL异常处理系统会记录一个文件不存在的错误而这些错误记录不仅不能真正反映出ASPNET应用程序的异常反而会给管理员带来更多麻烦我的解决方法是通过判断if(exception is SystemWebHttpException)来过滤这些HttpException