当网站 运行 出错时,不能将 原本的异常 信息 直接显示出来,这样很不友好,用户也看不懂;而且,异常信息会显示出调用堆栈,会影响网站的安全性。
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 即可。
对于 要 记录日志的 异常 才 使用以上两种方法。