文檔目錄
本節內容:
簡介
這個文檔針對Asp.net Mvc和Web Api,如果你對Asp.net Core感興趣,請看Asp.net Core文檔。
在一個Web應用裡,異常通常在Mvc控制器的Action或Web Api 控制器的Action裡被處理,當一個異常姓時,應用的用戶會通過某種方式收到錯誤信息和錯誤的可能原因。
如果一個錯誤發生在平常的HTTP請求裡,會顯示一個頁面錯誤,如果一個錯誤發生在一個AJAX請求裡,服務端把錯誤發給客戶端,客戶端負責處理和顯示給用戶。
在所有Web請求裡,處理異常是一件乏味且重復的事情,ABP自動化了這一過程,你幾乎不用顯式處理任何異常,ABP處理所有異常、日志記錄它們並返回對應的格式化的響應給客戶端,同時在客戶端處理這個響應並顯示錯誤信息給用戶。
啟用錯誤處理
要啟用ABP控制器的錯誤處理,customErrors的mode必須啟用:
<customErrors mode="On" />
如果你不想在本地計算上處理錯誤,可以把它設置為“RemoteOnly”。
注意:只需要為Asp.net Mvc控制器設置這個,Web Api 和 Asp.net Core 的控制器不需要設置。
非Ajax請求
如果不是一個AJAX請求,將顯示一個錯誤頁面。
顯示異常
此處,有一個Mvc控制器的Action拋出一個任意的異常:
public ActionResult Index() { throw new Exception("A sample exception message..."); }
當然,這個異常也會被調用這個Action的另一個方法拋出,ABP處理這個異常、日志記錄它並顯示“Error.cshtml”視圖,你可以自定義這個視圖來顯示錯誤,一個錯誤視圖的示例(在ABP模板裡默認的Error視圖):
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 模型
ABP傳遞一個ErrorViewModel對象作為模型給Error視圖:
public class ErrorViewModel { public AbpErrorInfo ErrorInfo { get; set; } public Exception Exception { get; set; } }
ErrorInfo包含能顯示給用戶的錯誤細節信息,Exception對象就是拋出的異常,你可以核實它並顯示額外的信息,例如,如果它是一個AbpValidationException,你可以顯示驗證錯誤信息:
AJAX 請求
如果Mvc的Action返回類型是JsonResult(或異步Action的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對象提供了錯誤message(信息)和details(明細)。
當你使用ABP基礎架構在客戶端發送AJAX請求,它自動處理這個JSON對象,並使用message API顯示錯誤信息給用戶,更多信息查看AJAX Api。
異常事件
當ABP處理任何異常時,它會觸發一個AbpHandledExceptionData事件,它可被注冊後通知並發出通知(查看事件總線文檔獲取更多信息),例如:
public class MyExceptionHandler : IEventHandler<AbpHandledExceptionData>, ITransientDependency { public void HandleEvent(AbpHandledExceptionData eventData) { //TODO: Check eventData.Exception! } }
如果你把這個示例類加入到你的應用(通常是Web應用),當ABP處理異常時,HandleEvent方法將被調用,所以,你可以深入的檢查這個異常處理。
kid1412附:英文原文:http://www.aspnetboilerplate.com/Pages/Documents/Handling-Exceptions