當前位置: 妍妍網 > 碼農

在 ASP.NET Core Web API 中使用異常篩選器捕獲和統一處理異常

2024-02-09碼農

在 ASP.NET Core Web API 中,例外處理是一個非常重要的環節。透過捕獲和處理異常,我們可以確保應用程式的健壯性,並向使用者提供友好的錯誤響應。ASP.NET Core 提供了一種機制,即異常篩選器(Exception Filters),它允許我們在全域範圍內捕獲和處理異常。

一、異常篩選器的工作原理

異常篩選器是實作了 IExceptionFilter 介面的類。當 ASP.NET Core 管道中的中介軟體丟擲異常時,異常篩選器會被觸發。它允許我們在異常被發送到客戶端之前,對異常進行處理,比如記錄日誌、修改異常訊息等。

二、建立異常篩選器

要建立一個異常篩選器,你需要實作 IExceptionFilter 介面,並實作其中的 OnException 方法。

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
public classCustomExceptionFilter : IExceptionFilter
{
publicvoidOnException(ExceptionContext context)
{
// 在這裏處理異常
// context.Exception 包含了丟擲的異常資訊
// 例如,我們可以記錄異常資訊
// LogException(context.Exception);
// 也可以修改響應內容
context.Result = new ObjectResult(new { error = "An error occurred" })
{
StatusCode = StatusCodes.Status500InternalServerError
};
// 還可以阻止異常繼續向上層傳播
// context.ExceptionHandled = true;
}
}


三、註冊異常篩選器

異常篩選器可以在多個級別註冊:全域、控制器或動作。

  1. 全域註冊 :在 Startup.cs ConfigureServices 方法中,使用 IMvcBuilder AddFilters 方法註冊。

publicvoidConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.Filters.Add<CustomExceptionFilter>(); // 全域註冊異常篩選器
});
}

  1. 控制器級別註冊 :在控制器類上套用 [ServiceFilter] 內容。

[ServiceFilter(typeof(CustomExceptionFilter))]
public classMyController : ControllerBase
{
// ...
}

  1. 動作級別註冊 :在動作方法上套用 [ServiceFilter] 內容。

public classMyController : ControllerBase
{
[ServiceFilter(typeof(CustomExceptionFilter))]
public IActionResult MyAction()
{
// ...
}
}

四、註意事項

  • 異常篩選器是在中介軟體之後執行的,這意味著它們可以捕獲由中介軟體丟擲的異常。

  • 異常篩選器不會捕獲到在控制器建構函式中丟擲的異常。對於這些情況,你需要在建構函式中使用 try-catch 塊來手動處理異常。

  • 異常篩選器不應依賴於 HTTP 上下文,因為它們可能在非 HTTP 請求的場景下被呼叫。

  • 五、總結

    透過實作和使用異常篩選器,你可以在 ASP.NET Core Web API 中全域地捕獲和處理異常,從而提供一致和友好的錯誤響應給使用者。同時,透過記錄異常資訊,你還可以幫助開發人員更好地了解應用程式的執行狀況,並進行相應的偵錯和最佳化。