MVC框架 - 例外處理


在ASP.NET中,錯誤處理是通過使用標準的嘗試捕捉方法或使用應用程式事件。ASP.NET MVC附帶內建支援,被稱為異常過濾器功能例外處理。在這裡我們要學習兩種方法:一個是定義HandleError過濾器,另一個是重寫onException方法。

覆蓋onException方法

使用這種方式在當要處理整個操作方法所有的異常在控制器級別。

要理解這種方式,建立一個MVC應用程式(包括跟隨在前面章節中的步驟)。現在新增一個新的控制器類,並新增以下程式碼將覆蓋onException方法,並明確在行動方法丟擲一個錯誤:

mvc_exception_handling

現在,讓我們建立一個通用的檢視名為Error,顯示給使用者在任何異常的應用程式發生時。在Views檔案夾內,建立一個名為Shared的新檔案夾,並新增一個新的名為Error的檢視。

mvc_error_handling

拷貝下面下面的程式碼到新建檔案: Error.cshtml:

mvc_exception_common_view

如果現在嘗試執行應用程式,它會給出結果如下。當任何異常發生在控制器內的操作方法時,上面的程式碼會渲染錯誤在檢視中。

mvc_common_exception_handling

這種方法的優點是,在同一個控制器中的多個動作可以共用這個錯誤處理邏輯。 但是,缺點是不能跨越多個控制器使用相同的錯誤處理邏輯。

HandleError屬性

HandleError的屬性是學習過濾器過濾操作之一,在操作過濾器的篇章。HandleErrorAttribute是IExceptionFilter是的預設實現。該過濾器處理所有的控制器動作,過濾器和檢視引發的例外。

要使用此功能,首先開啟web.config檔案的customErrors部分。開啟web.config把System.Web下面的程式碼,並將其值設定為ON。

    <customErrors mode="On"/>

我們已經有了下檢視Shared檔案夾中建立的錯誤檢視。這一次,這個檢視檔案的程式碼更改為強型別,鍵入使用HandleErrorInfo模型(這是System.Web.MVC下存在):

@model System.Web.Mvc.HandleErrorInfo
@{
Layout = null;
}
 
<!DOCTYPE html>
<html>
<head>
   <meta name="viewport" content="width=device-width" />
   <title>Error</title>
</head>
<body>
<h2>
    Sorry, an error occurred while processing your request.

</h2>
    <h2>Exception details</h2>
<p>
    Controller: @Model.ControllerName <br>
    Action: @Model.ActionName
    Exception: @Model.Exception
</p>
  
</body>
</html>

現在,將下面的程式碼在控制器檔案,其中規定在控制器檔案[HandleError]屬性。

using System;
using System.Data.Common;
using System.Web.Mvc;

namespace ExceptionHandlingMVC.Controllers
{
    [HandleError]
    public class ExceptionHandlingController : Controller
    {
        public ActionResult TestMethod()
        {
            throw new Exception("Test Exception");
            return View();
        }
    }
}

如果嘗試現在執行的應用程式,會得到類似如下的錯誤:

mvc_exception

正如所看到的,這一次的錯誤包含了控制器和動作細節相關的更多資訊。以這種方式,HandleError可用於在任何級別和跨控制器處理這樣的錯誤。