ABP官方文檔翻譯 6.1.3 異常處理
處理異常
- 介紹
- 啟用錯誤處理
- Non-Ajax請求
- 顯示異常
- UserFriendlyException
- Error模型
- AJAX請求
- 異常事件
介紹
此文檔是與ASP.NET MVC和Web API相關的。如果你對ASP.NET Core感興趣,參見ASP.NET Core文檔。
在web應用中,異常通常在MVC Controller actions和Web API Controller actions中處理。當異常發生時,應用程序的用戶以某種方式被告知錯誤的相關信息及原因。
如果錯誤在正常的HTTP請求時發生,將會顯示一個異常頁。如果在AJAX請求中發生錯誤,服務器發送錯誤信息到客戶端,然後客戶端處理錯誤並顯示給用戶。
在所有的Web請求中處理異常是件乏味且重復的工作。ABP自動化完成異常處理,幾乎從不需要顯示的處理任何異常。ABP處理所有的異常、記錄異常並返回合適、格式化的響應到客戶端。在客戶端處理這些響應並將錯誤信息顯示給用戶。
啟用錯誤處理
要啟用ASP.NET MVC控制器的錯誤處理 ,ASP.NET MVC 引用必須啟用customErrors模型。
<customErrors mode="On" />
如果你不想在本地計算機處理錯誤,可以把它設置為‘RemoteOnly‘。註意,只有ASP.NET MVC控制器需要這樣設置,Web API控制器並不需要。
如果你已經在全局過濾器處理了異常,那麽它可能會隱藏異常,ABP的異常處理就可能不會如期望的那樣工作。所以,如果需謹慎設置全局異常處理過濾器。
Non-Ajax請求
如果請求不是AJAX的,將會顯示一個錯誤頁。
顯示異常
這裏,有一個MVC控制器的action,它拋出了一個隨意的異常:
public ActionResult Index() { throw new Exception("A sample exception message..."); }
當然,這個異常可能由另一個方法拋出,而這個方法的調用在這個action裏。ABP處理這個異常、記錄它並顯示‘Error.cshtml‘視圖。你可以自定義這個視圖來顯示錯誤。一個示例錯誤視圖(在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記錄它但這次不隱藏異常:
所以,如果你想顯示一個特定的錯誤信息給用戶,那就拋出一個UserFriedlyException(或者一個繼承自這個類的異常)。
Error模型
ABP傳遞一個ErrorViewModel對象作為Error視圖的model:
public class ErrorViewModel { public AbpErrorInfo ErrorInfo { get; set; } public Exception Exception { get; set; } }
ErrorInfo包含可以顯示給用戶錯誤的詳細信息。Exception對象即為拋出的異常。如果你想的話,可以檢查它並顯示額外信息。例如,如果它是一個AbpValidationException,我們可以顯示校驗錯誤:
AJAX請求
如果MVC action的返回類型時JsonResult(或異步actions為Task<JsonResult>),ABP返回給客戶一個基於異常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了解更多信息。
異常事件
當ABP處理任何異常時,它會觸發AbpHandledExceptionData事件,這個事件可以被註冊並被通知(參見eventbus文檔了解更多關於Event Bus的信息)。示例:
public class MyExceptionHandler : IEventHandler<AbpHandledExceptionData>, ITransientDependency { public void HandleEvent(AbpHandledExceptionData eventData) { //TODO: Check eventData.Exception! } }
如果你把這個示例類放到你的應用中(通常放到Web工程),HandleEvent方法會在所有異常發生時被ABP調用。所以,你可以好好的研究並處理這個異常。
返回主目錄
ABP官方文檔翻譯 6.1.3 異常處理