1. 程式人生 > >ABP(現代ASP.NET樣板開發框架)系列之23、ABP展現層——異常處理

ABP(現代ASP.NET樣板開發框架)系列之23、ABP展現層——異常處理

基於DDD的現代ASP.NET開發框架--ABP系列之23、ABP展現層——異常處理

ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。

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

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

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

開啟錯誤處理

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

<customErrors mode="On" />

也可以設定 'RemoteOnly' 如果你不想在本地處理這些錯誤。

非Ajax請求

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

顯示異常(Showing exceptions)

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

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

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

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

使用者異常友好化(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(或者一個派生自該異常類的型別,也就是說繼承這個異常類的子類)。

錯誤模型(Error model)

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

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

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

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。

異常事件

當ABP處理任何Web請求的異常時,它會觸發AbpHandledExceptionData事件,當然你必須註冊該事件,並且寫相應的處理程式碼。詳細資訊請參照eventbus documentation。

希望更多國內的架構師能關注到ABP這個專案,也許這其中有能幫助到您的地方,也許有您的參與,這個專案可以發展得更好。

歡迎加QQ群:

ABP架構設計交流群:134710707 ABP架構設計交流群      ABP架構設計交流2群: 579765441ABP架構設計交流群2

相關推薦

ABP(現代ASP.NET樣板開發框架)系列23ABP展現——異常處理

基於DDD的現代ASP.NET開發框架--ABP系列之23、ABP展現層——異常處理 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 在 web 應用程式中,異常通常是在 MVC Controller actions

ABP(現代ASP.NET樣板開發框架)系列10ABP領域——實體

基於DDD的現代ASP.NET開發框架--ABP系列之10、ABP領域層——實體 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 本文由深圳-Carl提供翻譯 實體是DDD(領域驅動設計)的核心概念之一。Eric Eva

ABP(現代ASP.NET樣板開發框架)系列4ABP模組系統

基於DDD的現代ASP.NET開發框架--ABP系列之4、ABP模組系統 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。  本文由東莞-天道提供翻譯  ABP模組系統簡介 ABP框架提供了建立和組裝模組的基礎,一個模組

ABP(現代ASP.NET樣板開發框架)系列6ABP依賴注入

基於DDD的現代ASP.NET開發框架--ABP系列之6、ABP依賴注入 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。  本文由 上海-半冷 提供翻譯 什麼是依賴注入 如果你已經知道依賴注入的概念,建構函式和屬性注入

ABP(現代ASP.NET樣板開發框架)系列9ABP設定管理

基於DDD的現代ASP.NET開發框架--ABP系列之9、ABP設定管理 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 本文由山東-李偉提供翻譯 介紹 每個應用程式需要儲存一些設定並在應用程式的某個地方使用這些設定。

ABP(現代ASP.NET樣板開發框架)系列2ABP入門教程

基於DDD的現代ASP.NET開發框架--ABP系列之2、ABP入門教程 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程式的新起點,它旨在成為一個通用的

ABP(現代ASP.NET樣板開發框架)系列17ABP應用——引數有效性驗證

基於DDD的現代ASP.NET開發框架--ABP系列之17、ABP應用層——引數有效性驗證 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 應用程式的輸入資料首先應該被檢驗是否有效。輸入的資料能被使用者或其他應用程式提

ABP(現代ASP.NET樣板開發框架)系列16ABP應用——資料傳輸物件(DTOs)

基於DDD的現代ASP.NET開發框架--ABP系列之16、ABP應用層——資料傳輸物件(DTOs) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 資料傳輸物件(Data Transfer Objects)用於應用層

ABP(現代ASP.NET樣板開發框架)系列13ABP領域——資料過濾器(Data filters)

基於DDD的現代ASP.NET開發框架--ABP系列之13、ABP領域層——資料過濾器(Data filters) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 介紹 在資料庫開發中,我們一般會運用軟刪除(soft

ABP(現代ASP.NET樣板開發框架)系列21ABP展現——Javascript函式庫

基於DDD的現代ASP.NET開發框架--ABP系列之21、ABP展現層——Javascript函式庫 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 ASP.NET Boilerplate的js庫提供了一些讓java

ABP(現代ASP.NET樣板開發框架)系列14ABP領域——領域事件(Domain events)

基於DDD的現代ASP.NET開發框架--ABP系列之14、ABP領域層——領域事件(Domain events) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 在C#中,一個類可以定義其專屬的事件並且其它類可以註冊該事

ABP(現代ASP.NET樣板開發框架)系列5ABP啟動配置

基於DDD的現代ASP.NET開發框架--ABP系列之5、ABP啟動配置 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。  本文由 東莞-天道 提供翻譯 譯者注:在看這一節的內容之前,建議大家先下載module-ze

ABP(現代ASP.NET樣板開發框架)系列3ABP分層架構

基於DDD的現代ASP.NET開發框架--ABP系列之3、ABP分層架構 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 前言 為了減少複雜性和提高程式碼的可重用性,採用分層架構是一種被廣泛接受的技術。為了實現分層的

ABP(現代ASP.NET樣板開發框架)系列19ABP應用——審計日誌

基於DDD的現代ASP.NET開發框架--ABP系列之19、ABP應用層——審計日誌 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 維基百科定義:審計跟蹤(也稱為稽核日誌)是一個安全相關的時間順序記錄,記錄這些記錄的

ABP(現代ASP.NET樣板開發框架)系列15ABP應用——應用服務(Application services)

基於DDD的現代ASP.NET開發框架--ABP系列之15、ABP應用層——應用服務(Application services) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 本文由東莞-天道提供翻譯 應用服務用於將領

ABP(現代ASP.NET樣板開發框架)系列8ABP日誌管理

基於DDD的現代ASP.NET開發框架--ABP系列之8、ABP日誌管理 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 本文由東莞-天道提供翻譯 Server side(伺服器端) ASP.NET Boilerpla

ABP(現代ASP.NET樣板開發框架)系列1ABP總體介紹

基於DDD的現代ASP.NET開發框架--ABP系列之1、ABP總體介紹 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程式的新起點,它旨在成為一個通用的

ABP(現代ASP.NET樣板開發框架)系列12ABP領域——工作單元(Unit Of work)

基於DDD的現代ASP.NET開發框架--ABP系列之12、ABP領域層——工作單元(Unit Of work) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 通用連線和事務管理方法 連線和事務管理是使用資料庫的應用程

ABP(現代ASP.NET樣板開發框架)系列22ABP展現——導航欄設定

基於DDD的現代ASP.NET開發框架--ABP系列之22、ABP展現層——導航欄設定 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 每一個WEB應用程式都有導航選單,Abp也為使用者提供了通用的建立和顯示選單方式。

ABP(現代ASP.NET樣板開發框架)系列7ABP Session管理

基於DDD的現代ASP.NET開發框架--ABP系列之7、ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 簡介 如果一個應用程式需要登入,則它必須知道當前使用者執行了什麼操作。因此ASP.