【问题标题】:How to catch exception from controller (or service) by middleware?如何通过中间件从控制器(或服务)捕获异常?
【发布时间】:2019-08-11 12:16:37
【问题描述】:

如何在 .Net Core WebApi 中捕获来自控制器(或服务)的所有异常?

我的服务

    public class MathService : IMathService
    {
       (...)

        public double Divide(int x, int y)
        {
            return x / y;
        }
        (...)
    }

我的控制器

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        (...)
        // GET api/values
        [HttpGet]
        public ActionResult<double> Get()
        {
            return _math.Divide(7, 0);
        }
    }

我的中间件

public class ErrorHandlingMiddleware
    {
        private readonly RequestDelegate next;
        public ErrorHandlingMiddleware(RequestDelegate next)
        {
            this.next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            try
            {
                await next(context);
            }
            catch (Exception ex)
            {
                await HandleExceptionAsync(context, ex);
            }
        }

        private static Task HandleExceptionAsync(HttpContext context, Exception ex)
        {
            var code = HttpStatusCode.InternalServerError; // 500 if unexpected

            if (ex is Exception) code = HttpStatusCode.BadRequest;

            var result = JsonConvert.SerializeObject(new { error = ex.Message });
            context.Response.ContentType = "application/json";
            context.Response.StatusCode = (int)code;
            return context.Response.WriteAsync(result);
        }
    }

启动配置

            (...)
            app.UseMiddleware(typeof(ErrorHandlingMiddleware));
            app.UseMvc();

这应该足以捕获异常并返回带有错误的 JSON 消息吧?

我错过了什么?

谢谢

【问题讨论】:

  • 确保中间件首先在管道中注册,它可以捕获下游的所有内容。
  • 请注意有一个内置的异常中间件docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/…
  • 我猜您实际上要寻找的是自定义异常处理程序中间件。如果没有,那么你只想将用户重定向到自定义错误页面,然后在启动的配置方法中使用app.UseExceptionHandler("/home/error");
  • @Dennis1679 我想返回一个 json 错误响应,用于 API,而不是视图。
  • @anibal 在这种情况下,如果发生错误,HTTP 500 状态代码对消费应用程序更具描述性和有用性。幸运的是,当您不向应用程序添加错误处理中间件时,这是默认行为。看,在最简单的情况下,您的整个应用程序充当另一个应用程序的 API,您可能会在没有任何错误处理中间件的情况下逃脱。但实际上,您可能希望确保使用中间件记录错误,但无论如何您肯定不需要在这种情况下更改响应正文。

标签: exception .net-core middleware


【解决方案1】:

可以捕获所有异常并映射到正确的 http 响应代码 GlobalExceptionHandler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多