异常处理程序无法捕获自定义中间件(.NET Core 2.0)中的整个异常

时间:2018-08-17 09:33:21

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

我尝试使用中间件进行异常处理。我写了一些代码,但是没有用。有问题。通常,如果使用try catch范围,则可以捕获异常。但是我无法掌握中间件。怎么了?

我在try范围中寻找结果实体。结果实体存在异常,因此我尝试使用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;
    }
}

1 个答案:

答案 0 :(得分:1)

在中间件中使用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));
    }
}