基於DDD的現代ASP.NET開發框架--ABP系列之23、ABP展現層——異常處理
ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。
ABP的官方網站:http://www.aspnetboilerplate.com
ABP在Github上的開源項目:https://github.com/aspnetboilerplate
在 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架構設計交流2群: 579765441