前言

一直在给Team的人强调“Good programming is good Error Handling”,没人喜欢YSOD(Yellow Screen of Death)。我每次看到黄页的时候都是心惊肉跳的,尤其是在给客户演示的时候,所以在任何时候,如果出现黄页是由于你开发的代码导致的话,对不起,我会给你的绩效打很低的分。
当然,有些情况的黄页,在某些特殊的情况,我们可能真的无法预知,但我们起码得一些技巧让终端用户看不到这个YSOD页面。

方案

幸运的是,在MVC3里有现成的功能支持让我们可以做到这一点,它就是HandleErrorAttribte类,有2种方式可以使用它,一是在类或者方法上直接使用HandleError属性来定义:

// 在这里声明 [HandleError] public class HomeController : Controller {     // 或者在这里声明     // [HandleError]     public ActionResult Index()     {         return View();     } }

另外一种方式是使用MVC3的Global Filters功能来注册,默认新建MVC项目在Global.asax文件里就已经有了,代码如下:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {     filters.Add(new HandleErrorAttribute()); }
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults );
}
protected void Application_Start() { AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }

代码段里的filters.Add(new HandleErrorAttribute());设置是说整个程序所有的Controller都使用这个HandleErrorAttribute来处理错误。
注意:HandleErrorAttribute只处理500系列错误,所以404错误需要另外单独处理,稍后会提到。
下一步,我们要做的是开启web.config根目录里的customErrors(不是views目录下的那个web.config哦),代码如下:

<customerrors mode="On" defaultredirect="~/Error/HttpError">     <error redirect="~/Error/NotFound" statuscode="404" /> </customerrors>

defaultredirect是设置为所有错误页面转向的错误页面地址,而里面的error元素可以单独定义不同的错误页面转向地址,上面的error行就是定义404所对应的页面地址。
最后一件事,就是定义我们所需要的错误页面的ErrorController:

public class ErrorController : BaseController {     //     // GET: /Error/     public ActionResult HttpError()     {        return View("Error");     }      public ActionResult NotFound()     {         return View();     }     public ActionResult Index()     {         return RedirectToAction("Index", "Home");     } }

默认Error的view是/views/shared/Error.cshtml文件,我们来改写一下这个view的代码,代码如下:

@model System.Web.Mvc.HandleErrorInfo @{     ViewBag.Title = "General Site Error"; }
<h2>A General Error Has Occurred</h2>
@if (Model != null) { <p>@Model.Exception.GetType().Name<br /> thrown in @Model.ControllerName @Model.ActionName</p> <p>Error Details:</p> <p>@Model.Exception.Message</p> }

你也可以通过传递参数来重写GlobalFilter里的HandleErrorAttribte注册,单独声明一个特定的Exception,并且带有Order参数,当然也可以连续声明多个,这样就会多次处理。

filters.Add(new HandleErrorAttribute {     ExceptionType = typeof(YourExceptionHere),     // DbError.cshtml是一个Shared目录下的view.     View = "DbError",     Order = 2 });

最新文章

  1. php bmp中创建图像bmp2gd,让GD支持32位BMP
  2. 关于box-shadow属性的一点心得
  3. String字符串类课后作业
  4. js判断浏览器
  5. 创建一个三角形类,成员变量三边,方法求周长,创建类主类A来测试它
  6. Action类中获取request等对象的方法
  7. css - position relative与display table-cell深入分析
  8. 用Socket做一个局域网聊天工具(转)
  9. 通过EL表达式,后台数据传到前台,引号及后面的数据被截断的问题:
  10. java实现 阿拉伯数字转换为汉字数字 算法
  11. iOS开发: 关于Certificate, Identifier &amp; Profile
  12. Ansible之 Inventory 资源清单介绍
  13. iOS原生地图与高德地图的使用
  14. IDEA上传项目至git
  15. python基础之函数式编程
  16. selenium常用操作
  17. tensorboard使用方法
  18. PHP7 学习笔记(六)403 Forbidden - WAMP Server 2.5
  19. 百度地图API自动定位和3种导航
  20. 微信小程序——template的循环嵌套

热门文章

  1. CIL
  2. IDEA导出想要的sql供H2数据库使用
  3. linux之使用samba实现文件共享
  4. zTree返回的菜单列表中根据权限打勾
  5. [C/C++]宽字符与控制台程序
  6. linux centos6.5 安装gcc-c++时出现 yum install gcc-c++ cannot find a valid baseurl for repo...
  7. javascript:;与javascript:void(0)
  8. 学习动态性能表(4)--v$sqltext&amp;v$sqlarea
  9. SQL TINYINT 1 讨论记录
  10. Android Theme的使用