1. 程式人生 > >ABP官方文件(三十六)【異常處理】

ABP官方文件(三十六)【異常處理】

6.5 ABP表現層 - 異常處理

6.5.1 簡介

該文件只是針對ASP.NET MVC 以及Web API。如果你對ASP.NET Core也感興趣,請參考ASP.NET Core文件

在 web 應用程式中,異常通常是在 MVC Controller actions 和 Web API Controller actions 中被處理的。當異常發生時,應用程式使用者被以某種方式告知該錯誤和該錯誤產生的可選原因(就是列舉出產生該異常的多種原因,產生錯誤的原因可能是列舉出的一種也可能是多種。)

如果一個常規的HTTP請求產生錯誤,那麼一個錯誤頁面會展示。如果AJAX請求產生錯誤,伺服器端會發送錯誤訊息到客戶端,然後客戶端處理並顯示該錯誤給使用者。

在所有的Web請求中處理異常是一個單調乏味並且重複性的工作。然而在ABP中,你幾乎不需為任何異常的指定明確的異常處理,ABP會自動的記錄這些異常並且以適當的格式做出響應返回到客戶端。也就是說,在客戶端處理這些響應並且將錯誤詳細顯示給客戶。

6.5.2 開啟錯誤處理

為了開啟錯誤處理,customErrors 必須設定如下:

<customErrors mode="On" />

也可以設定 ‘RemoteOnly’ 如果你不想在本地處理這些錯誤。請注意,這只是針對ASP.NET MVC控制器,對於Web API控制器則是沒必要的。

如果你已在全域性過濾器中已經處理了異常,那麼異常可能會被隱藏,並且ABP異常可能也不會按你預期的那樣工作。所以,如果你想那樣做的話,請小心操作。

6.5.3 非Ajax請求

如果不是Ajax 請求,那麼將會顯示一個錯誤頁面。

1. 顯示異常(Showing exceptions)

MVC Controller action丟擲了一個異常,如下所示:

public ActionResult Index()
{
    throw new Exception("A sample exception message...");
}

當然,這個異常能夠被指定呼叫的action中的另外的方法丟擲。ABP處理這個異常,記錄異常資訊並且顯示’Error.cshtml’ 檢視。你能夠自定義這個檢視來顯示該錯誤。example 錯誤檢視(這個檢視是ABP中預設錯誤檢視模板)。

ABP 隱藏了異常的詳細資訊,而是向用戶展示了一個標準的(本地化的,友好化的)錯誤資訊。除非你明確指定丟擲一個UserFriendlyException 異常。

2. 使用者異常友好化(UserFriendlyException)

UserFriendlyException是一個特殊的異常型別,被用來直接的顯示給使用者。請看下面示例:

public ActionResult Index()
{
    throw new UserFriendlyException("Ooppps! There is a problem!", "You are trying to see a product that is deleted...");
}

ABP記錄這個異常並且不隱藏這次的異常資訊:

所以,如果你想顯示一個特殊的錯誤資訊給使用者,你只需要丟擲一個UserFriendlyException(或者一個派生自該異常類的型別,也就是說繼承這個異常類的子類)。

3. 錯誤模型(Error model)

ABP傳遞一個ErrorViewModel 物件給Error檢視:

public class ErrorViewModel
{
    public AbpErrorInfo ErrorInfo { get; set; }
    public Exception Exception { get; set; }
}

ErrorInfo 包含了能夠顯示給客戶的詳細的異常資訊。Exception 物件就是那個被丟擲的異常。你能夠核實異常並且附加自定義資訊來顯示,如果你想這樣做的話。例如:我們能夠核實該異常是否是一個AbpValidationException。

6.5.4 AJAX請求

如果請求是一個AJAX請求,ABP會返回一個JSON物件到客戶端。ASP.NET MVC Controllers 和 ASP.NET Web API Controllers 也是這麼處理的。以JSON方式返回一個異常資訊,請看下面示例:

{
  "targetUrl": null,
  "result": null,
  "success": false,
  "error": {
    "message": "An internal error occured during your request!",
    "details": "..."
  },
  "unAuthorizedRequest": false
}

success: false 表示有一個錯誤發生。error物件提供了 錯誤資訊和錯誤的詳細描述

當你在客戶端用ABP的基礎設施來做一個AJAX請求時,它會用message API自動的處理這個JSON物件並且顯示錯誤資訊給使用者。更多資訊請參照AJAX API 和dynamic web api layer。

6.5.5 異常事件

當ABP處理任意異常時,它會觸發 AbpHandledExceptionData 事件,並且會發出通知如果你註冊了處理該事件的類。如下所示:

public class MyExceptionHandler : IEventHandler<AbpHandledExceptionData>, ITransientDependency
{
    public void HandleEvent(AbpHandledExceptionData eventData)
    {
        //TODO: Check eventData.Exception!
    }
}

如果你將該示例程式碼放入你的應用程式中(通常是你的web專案),ABP 會呼叫 HandleEvent 方法來處理所有的異常。所以,你可以檢視異常物件的詳細異常資訊。