MVC源碼分析 - Error過濾器

來源:互聯網
上載者:User

標籤:web   src   內容   bsp   建立   pre   string   使用   dir   

接 上一篇  內容, 這裡先看一下錯誤處理過濾器.

在看此部分之前, 先看看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來記錄錯誤, 然後將友好的錯誤頁面展現給使用者, 目的就達到了.

 目錄已同步

 

MVC源碼分析 - Error過濾器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.