首页 > 解决方案 > 异常处理程序未在自定义中间件 (.NET Core 2.0) 中捕获整个异常

问题描述

我尝试使用中间件进行异常处理。我写了一些代码,但它不起作用。有问题。通常,如果我使用 try catch 范围,我可以捕获异常。但我无法抓住中间件。怎么了?

我在尝试范围内寻找结果实体。结果实体有一个例外,所以我尝试使用 if 条件。我解决了这个问题,但我认为这是不可接受的:)

我在业务层(洋葱架构)中抛出了一些异常,例如:throw new Exception("have a problem");

还有我在 webapi 层的中间件类。如果我发现错误,我想发送响应一些数据。

我的中间件代码在下面

public class ExceptionHandlingMiddleware
{
    private readonly RequestDelegate _next;

    public ExceptionHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext httpContext)
    {
        try
        {
            var result = _next(httpContext);
            if (result.Exception != null)
                throw result.Exception;
            return result;
        }
        catch (Exception ex)
        {
            return HandleExceptionAsync(httpContext, ex);
        }
    }

    private Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        var code = ResponseCode.Alliswell;

        switch (exception)
        {
            case ServiceException _:
                code = ResponseCode.ServiceError;
                break;
            case BusinessException _:
                code = ResponseCode.BusinessError;
                break;
            case DataLayerException _:
                code = ResponseCode.DataLayerError;
                break;
            case EsriServiceException _:
                code = ResponseCode.EsriServiceError;
                break;
        }

        //var result = JsonConvert.SerializeObject(new { error = ex.Message });

        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        var responseEntity = new Response<object>
        {
            Data = null,
            Code = code,
            ErrorMessage = exception.Message,
            State = ResponseState.Error
        };
        var result = context.Response.WriteAsync(JsonConvert.SerializeObject(responseEntity));
        return result;
    }
}

标签: exception-handling.net-coreasp.net-core-2.0asp.net-core-webapiasp.net-core-middleware

解决方案


在中间件中使用 async await 语法,以便捕获任何抛出的异常

public class ExceptionHandlingMiddleware {
    private readonly RequestDelegate _next;

    public ExceptionHandlingMiddleware(RequestDelegate next) {
        _next = next;
    }

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

    private async Task HandleExceptionAsync(HttpContext context, Exception exception) {
        var code = ResponseCode.Alliswell;

        switch (exception) {
            case ServiceException _:
                code = ResponseCode.ServiceError;
                break;
            case BusinessException _:
                code = ResponseCode.BusinessError;
                break;
            case DataLayerException _:
                code = ResponseCode.DataLayerError;
                break;
            case EsriServiceException _:
                code = ResponseCode.EsriServiceError;
                break;
        }

        //var result = JsonConvert.SerializeObject(new { error = ex.Message });

        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        var responseEntity = new Response<object> {
            Data = null,
            Code = code,
            ErrorMessage = exception.Message,
            State = ResponseState.Error
        };
        await context.Response.WriteAsync(JsonConvert.SerializeObject(responseEntity));
    }
}

推荐阅读