.Net Core Web Api 中如何处理全局异常

    技术2022-07-10  151

    使用场景

    在请求Web Api的时候难免会碰到一些未处理的异常,此时服务器通常会返回500错误,为了更好的用户体验,我们需要捕获全局的未处理异常,并返回一个友好的错误信息给调用端。

    解决方案

    从.Net Core 开始,微软引入了中间件的概念,通过中间件我们可以拦截到所有的http请求,也可以捕获到所有未处理的异常。

    首先我们要定义一个中间件,如下: public class ExceptionHandlingMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; private readonly IHostEnvironment _host; public ExceptionHandlingMiddleware( RequestDelegate next, ILoggerFactory loggerFactory, IHostEnvironment host) { _next = next; _logger = loggerFactory.CreateLogger<ExceptionHandlingMiddleware>(); _host = host; } public async Task Invoke(HttpContext context) { try { await _next(context); } catch (Exception ex) { await HandleException(context, ex); } } private Task HandleException(HttpContext context, Exception exception) { _logger.LogError(exception, exception.Message); // 这里可以自定义返回类型 var body = JsonSerializer.Serialize(new { message = exception.Message, stackTrace = _host.IsDevelopment() ? exception.StackTrace : string.Empty }); context.Response.ContentType = "application/json"; context.Response.StatusCode = (int)HttpStatusCode.OK; return context.Response.WriteAsync(body); } }

    中间件就是普通的类,但是她包含了一个Invoke方法,这个也正是处理http请求的方法,我们可以在这里捕获异常并处理。

    接下来我们只要把该中间件注册到http管道中就可以了。

    修改Startup如下:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseMiddleware<ExceptionHandlingMiddleware>(); //other middleware }

    注意顺序要在其他处理逻辑的中间件之前,否则也无法捕获到异常。

    Processed: 0.010, SQL: 9