【问题标题】:Exception Handler not catching whole exception in custom middleware (.NET Core 2.0)异常处理程序未在自定义中间件 (.NET Core 2.0) 中捕获整个异常
【发布时间】:2019-01-24 07:43:46
【问题描述】:

我尝试使用中间件来处理异常。我写了一些代码,但它不起作用。有问题。通常,如果我使用 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-core asp.net-core-2.0 asp.net-core-webapi asp.net-core-middleware


    【解决方案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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多