接 上一篇 內容, 這裡先看一下錯誤處理過濾器. 在看此部分之前, 先看看MVC已經提供的功能吧. 一. MVC 自帶功能 1. 配置方法 這裡的mode預設是 Off , 就是會在頁面中直接顯示詳細的錯誤信息. 如果是 On, 則不會顯示詳細的錯誤信息, 顯示是這樣的: 在沒有配置具體 statu ...
接 上一篇 內容, 這裡先看一下錯誤處理過濾器.
在看此部分之前, 先看看MVC已經提供的功能吧.
一. MVC 自帶功能
1. 配置方法
<system.web> <!--mode : Off / On / RemoteOnly--> <customErrors mode="RemoteOnly"> <error statusCode="404" redirect="~/NotFound/Index"/> </customErrors> </system.web>
這裡的mode預設是 Off , 就是會在頁面中直接顯示詳細的錯誤信息.
如果是 On, 則不會顯示詳細的錯誤信息, 顯示是這樣的:
在沒有配置具體 status 的跳轉頁面的時候, 顯示是這樣的:
如果在下麵配置了錯誤狀態對應的跳轉頁面, 會跳轉到我們事先指定的頁面:
這裡的mode其實還有一個值:RemoteOnly. 這裡的意思是在伺服器端顯示詳細錯誤信息, 在客戶端顯示指定的頁面. 還是很好用的.
2. 在方法上加特性的方法
在這裡首先要介紹一下, 此特性的幾個參數.
從上圖中能看到4個參數, 看一下每一個參數是幹啥的.
參數 | 描述 |
ExceptionType | 要處理的異常類型 |
Master | 模板視圖的名稱, 存放在 Views/Shared 文件下 |
View | 內容視圖名稱, 也是存放在 Views/Shared 文件中 |
Order | 過濾器被應用的順序, 越小越靠前, 最高級別為-1, 預設為-1 |
[HandleError(ExceptionType = typeof(Exception), View = "Error500", Master = "_Layout1")] public ActionResult Index() { throw new Exception("Home/Index 主動拋出的異常"); }
二. 自定義過濾器
1. Controller 控制器中, 自定義 OnException 方法
在HomeController中, 加入如下兩個方法:
public ActionResult Index() { throw new Exception("Home/Index 主動拋出的異常"); } protected override void OnException(ExceptionContext filterContext) { filterContext.HttpContext.Response.Redirect("~/Errors/MyError?msg=" + filterContext.Exception.Message); }
然後創建一個錯誤處理控制器 ErrorsController, 加入如下方法:
public ActionResult MyError(string msg) { ViewBag.Msg = msg; return View(); }
到這裡, 準備工作就差不多了, 視圖部分我就不貼了, 直接上結果:
這種方式, 跟之前的許可權過濾器一樣, 只對本控制器內的方法起作用.
那是不是也像之前的那樣, 有一個全局的呢? Of course, yes.
2. 自定義全局/局部錯誤過濾器
新建一個自定義過濾器MyErrorsAttribute
public class MyErrorsAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); //標記此錯誤已經處理過, 如果別的錯誤捕捉器捕捉到此錯誤, 就不會重覆處理了. filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Redirect("~/Errors/MyError?msg=" + filterContext.Exception.Message); } }
接下來就是全局和局部的區分了.
1). 全局方式:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new MyErrorsAttribute()); } }
2). 局部方式 - 特性的方式
[MyErrors] public ActionResult Index() { throw new Exception("Foot/Index 主動拋出的異常"); }
在錯誤處理裡面, 可以使用log4來記錄錯誤, 然後將友好的錯誤頁面展現給用戶, 目的就達到了.