ABP文檔 - 異常處理


 

文檔目錄

 

本節內容:

 

簡介

這個文檔針對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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM