日期:2014-05-16  浏览次数:21044 次

ASP.NET MVC 异常处理
1. 友好的提示信息:
当网站 运行 出错时,不能将 原本的异常 信息 直接显示出来,这样很不友好,用户也看不懂;而且,异常信息会显示出调用堆栈,会影响网站的安全性。

2. 用户访问不存在的页面:
用户完全可以访问 根目录下不存在的页面。这个时候 就会出现异常。

例子: 360 首页,如果出现这种情况会重定向到 首页。而 新浪网会 出现一个 错误页面。

这都是比较好的 处理方法。


3. ASP.NET MVC 如何处理 用户访问不存在的页面:

我们可以在 web.config 里配置 <customerError/> 节,并设置一个默认的 页面,这样如果用户访问 不存在的页面(404),就重定向到这个页面。例如:

    <!--启动 异常处理-->
    <customErrors mode="On" defaultRedirect="Error.html">
      <error statusCode="404" redirect="Error.html"/>     
    </customErrors>

<customerError> 的 mode 可以 设置 是否处理异常。如果设置为 "RemoteOnly" ,则 在服务器 可以看到出错的 调用堆栈,而客户端浏览器 看到的是 错误 页面。

不过这个页面只能放在 网站的根目录下。

我们可以 定义一个 控制器操作(或者是 网站的首页),当出现 异常时,就导航到这个操作。

    <!--启动 异常处理-->
    <customErrors mode="On" defaultRedirect="Test/index">
      <error statusCode="404" redirect="Test/index"/>     
    </customErrors>

4. 日志处理:

使用 上面的做法,我们基本可以处理所有的错误信息了。<error/> 里可以设置 statusCode, 然后导航到 你自己定义的页面。但有时候这样还不能完全满足需求,比如我们需要 记录错误日志,以方便开发人员 调试修改。

可以在 以上的基础上加入 如下操作,进行日志记录:

1. 使用 Filter 标记属性,我们可以自定义 异常处理类(LogAttribute),派生自 FilterAttribute,IExceptionFilter ,然后 实现 OnException 方法,在  这个方法里面,将错误 信息 写入数据库 或者 本地文件。

  在 FilterConfig 里注册这个 标记属性 后,就可以 标记 Controller 或 Action。

  如:(这里只是简单演示)


    string path = AppDomain.CurrentDomain.BaseDirectory + @"/Exception/Log.txt"; //也可以保存到数据库
    StreamWriter writer = File.AppendText(path);
    writer.Write("\r\n" + filterContext.Exception.Source + ":" + filterContext.Exception.Message);
    writer.Close();    

2. 使用 自定义 Controller, BaseController 派生自 Controller ,并重写 OnException 方法,在这个方法里面,将错误 信息 写入数据库 或者 本地文 件。以后要处理异常的类 就直接 派生自 BaseController 即可。

  

    对于 要 记录日志的 异常 才 使用以上两种方法。