前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
前言
在 ASP.NET Core Web API 中,異常篩選器(Exception Filter)是一種用於處理髮生在 Web API 控制器或管道中的異常的機制。
異常篩選器可以捕獲和處理應用程式中發生的異常,當系統中出現未經處理的異常的時候,異常篩選器就會執行,我們可以在異常篩選器中對異常進行處理,例如記錄日誌、返回自定義錯誤信息等。
需要註意的是,只有 ASP.NET Core 線程中的未處理異常才會被異常篩選器處理。
本文主要通過一個實例來講述在 ASP.NET Core Web API 中如何使用異常篩選器。
Step By Step 步驟
-
創建一個ASP.NET Core webapi 項目
-
編寫自定義的異常篩選器 MyExceptionFilter,實現 IAsyncExceptionFilter 介面(註意其中的註釋)
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; public class MyExceptionFilter : IAsyncExceptionFilter { private readonly ILogger<MyExceptionFilter> logger; private readonly IHostEnvironment env; // 註入 ILogger 和 IHostEnvironment // IHostEnvironment 用於判斷環境類型 public MyExceptionFilter( ILogger<MyExceptionFilter> logger, IHostEnvironment env) { this.logger = logger; this.env = env; } public Task OnExceptionAsync(ExceptionContext context) { Exception exception = context.Exception; logger.LogError(exception, "UnhandledException occured"); string message; if (env.IsDevelopment()) { // 如果是開發環境,列印所有的異常堆棧信息 message = exception.ToString(); } else { // 否則只列印簡單信息 message = "程式中出現未處理異常"; } // 設置響應報文的內容 ObjectResult result = new ObjectResult(new { code = 500, message = message }); result.StatusCode = 500; context.Result = result; // 設置context.ExceptionHandled的值為true,讓ASP.NET Core不再執行預設的異常響應邏輯 context.ExceptionHandled = true; return Task.CompletedTask; } }
-
打開 Program.cs,設置全局的篩選器(註意其中的註釋)
using Microsoft.AspNetCore.Mvc; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // 註冊自定義異常過濾器服務 // MvcOptions是ASP.NET Core項目的主要配置對象 // 用於向Filters註冊全局的篩選器 builder.Services.Configure<MvcOptions>(opt => { opt.Filters.Add<MyExceptionFilter>(); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
-
打開控制器,模擬錯誤進行測試
using Microsoft.AspNetCore.Mvc; namespace 異常篩選器.Controllers { [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet(Name = "GetWeatherForecast")] public string Get() { throw new Exception("xxx"); } } }
我是老楊,一個執著於編程樂趣、至今奮鬥在一線的 10年+ 資深研發老鳥,是軟體項目管理師,也是快樂的程式猿,持續免費分享全棧實用編程技巧、項目管理經驗和職場成長心得!歡迎關註老楊的公眾號(名稱:代碼掌控者),和你共同探索代碼世界的奧秘!