CoreApi 3.1 - 全域性異常處理的幾種方式
阿新 • • 發佈:2020-10-14
一、過濾器方式
先定義一個異常過濾器
/// <summary> /// 異常過濾器 /// </summary> public class ExceptionFilter : IExceptionFilter { /// <summary> /// 發生異常時進入 /// </summary> /// <param name="context"></param> public void OnException(ExceptionContext context) {if (context.ExceptionHandled == false) { context.Result = new ContentResult { Content = context.Exception.Message,//這裡是把異常輸出,也可以不輸出,也可以輸出JSON結構的字串。 StatusCode = StatusCodes.Status200OK, ContentType = "text/html;charset=utf-8" }; } context.ExceptionHandled = true; //寫入日誌,或者其它操作 } }
再API控制器使用過濾器
[TypeFilter(typeof(ExceptionFilter))]//這裡使用自定義過濾器 [ApiController] public class MyController:ControllerBase { //..... }
二、配置方式
在Startup.cs中的,Configure
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //異常配置檔案寫法 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler(config => { config.Run(async context => { context.Response.StatusCode = 500; context.Response.ContentType = "application/json"; var error = context.Features.Get<IExceptionHandlerFeature>(); if (error != null) { var ex = error.Error; //輸出異常內容,也可以不輸出,也可以輸出JSON結構的字串 await context.Response.WriteAsync(ex.Message); } }); }); } }
三、中介軟體方式
先定義一個異常中介軟體
public class CustomExceptionMiddleware { private readonly RequestDelegate _next; //private readonly ILogger<CustomExceptionMiddleware> _logger; public CustomExceptionMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext httpContext) { try { await _next(httpContext); } catch (Exception ex) { //寫入日誌或者其它操作 //log await HandleExceptionAsync(httpContext, ex); } } private async Task HandleExceptionAsync(HttpContext httpContext, Exception ex) { httpContext.Response.StatusCode = StatusCodes.Status200OK; httpContext.Response.ContentType = "application/json;charset=utf-8"; //輸出異常內容 await httpContext.Response.WriteAsync(ex.Message); //如果不輸出,則需要下面這句 //return Task.CompletedTask; } }
再定義一個擴充套件類
public static class CustomExceptionMiddlewareExtensions { public static IApplicationBuilder UseCustomExceptionMiddleware(this IApplicationBuilder builder) { return builder.UseMiddleware<CustomExceptionMiddleware>(); } }
在Startup的Configure中配置
//異常配置檔案寫法 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseCustomExceptionMiddleware(); }
也可以不判斷開發環境