MVC源碼分析 - Error過濾器

来源:http://www.cnblogs.com/elvinle/archive/2017/01/19/6305450.html
-Advertisement-
Play Games

接 上一篇 內容, 這裡先看一下錯誤處理過濾器. 在看此部分之前, 先看看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來記錄錯誤, 然後將友好的錯誤頁面展現給用戶, 目的就達到了.

 目錄已同步

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 去埠號功能主要用於Apache與IIS等WEB伺服器共存時,去除功能變數名稱後面所帶的埠 本文案例採用我開發的純綠色PHP集成環境PHPWAMP裡面的“去埠”功能模塊。 案例演示: 點擊常用工具,打開“去掉功能變數名稱非80埠”功能即可 彈出的界面菜單如下圖 如下填寫,功能變數名稱填寫格式abc.com,具體如下圖 ...
  • 最近有學生向我咨詢如何同時建立多個不同PHP版本站點,並自定義任意版本,軟體是否可以多開,PHPWAMP如何設置才能與其他的環境同時使用等問題,本文將一一解決。 簡單介紹一下PHPWAMP 你們應該會經常聽到WAMP這詞吧,那麼WAMP是什麼意思? Windows下的Apache+Mysql+PHP ...
  • phpwamp在伺服器搭建網站,php網站在伺服器上的搭建方式,雲伺服器上如何使用PHP綠色集成環境 ...
  • 1.泛型的約束: (1)介面約束; (2)基類約束,基類約束必須放在第一(假如有多個約束); (3)struct/class約束; (4)多個參數類型的約束,每個類型參數都要用where關鍵字; (5)構造器約束,只能是無參構造器,如new(); (6)約束可以由派生類繼承,但必須在派生類中顯式地指 ...
  • 多線程內容大致分兩部分,其一是非同步操作,可通過專用,線程池,Task,Parallel,PLINQ等,而這裡又涉及工作線程與IO線程;其二是線程同步問題,鄙人現在學習與探究的是線程同步問題。 通過學習《CLR via C#》裡面的內容,對線程同步形成了脈絡較清晰的體繫結構,在多線程中實現線程同步的是 ...
  • 1、設置圖片透明 this.pibox.BackColor = System.Drawing.Color.Transparent; //將背景設置為透明 this.pibox.Parent = lab_show; //將父容器設置為上一層的文件名 2、Timer不起作用 1、先托控制項Timer, 並 ...
  • 1.重寫GetHashCode方法註意點: (1)重寫GetHashCode方法,也應重寫Equals方法,否者編譯器會警告。 (2)相等的對象必須有相等的散列碼(若a.Equals(b),則a.GetHashCode()==b.GetHashCode())。 (3)GetHashCode()不應引 ...
  • 1.結構:結構除了可以含有屬性和欄位,還可以包方法和構造器,但不能包含黠認(無參數}的構造器。有的時候(比如在實例化一個數組的時候)不會調用值類型的構造器,因為所有數組記憶體都轉為用零來初始化,為了避免因為預設構造器只是偶爾調用而造成不一致,C#完全禁止了用戶顯式定義預設構造器,因為編譯器會將聲明時的 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...