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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...