1. 程式人生 > >ABP官方文檔翻譯 6.1.3 異常處理

ABP官方文檔翻譯 6.1.3 異常處理

lan nth 響應 friendly dex tps 過濾 rod geturl

處理異常

  • 介紹
  • 啟用錯誤處理
  • 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 異常處理