# 异常处理

异常处理我是使用中间件的方法实现的,这种方法会比异常过滤器的范围更大,使用起来也更优雅。

我在WebApi创建一个ApiExceptionMiddleware类,原理非常简单。就是套一层trycatch

public class ApiExceptionMiddleware
    {
        private readonly RequestDelegate _next;
        public ApiExceptionMiddleware(RequestDelegate next)
        {
            _next = next;
        }
        public async Task InvokeAsync(HttpContext context, ILoggerFactory loggerFactory)
        {
            try
            {
                await _next(context);
            }
            catch (Exception ex)
            {
                var type = ex.TargetSite?.DeclaringType;
                var loggerName = context.Request.Path + (type != null ? $"[{type?.FullName}]" : "");
                var logger = loggerFactory.CreateLogger(loggerName);

                ApiResultDto resultDto = null;
                //判断是否是ApiFailException异常类型
                if (ex is ApiFailException)
                {
                    var apiException = ex as ApiFailException;
                    resultDto = ApiResultDto.Fail(apiException.Code,apiException.Message);
                    logger.LogInformation(resultDto.Code, resultDto.Message);
                }
                else
                {
                    //异常处理
                    var exceptionId = Guid.NewGuid();
                    resultDto = ApiResultDto.Exception(GetExceptionMessage(ex), exceptionId);
                    var eventId = new EventId(resultDto.Code, exceptionId.ToString());
                    logger.LogError(eventId, ex, resultDto.Message);
                }
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync(CommonHelper.ObjectToJsonString(resultDto));
            }
        }

        private string GetExceptionMessage(Exception exception)
        {
            if (exception.InnerException == null)
            {
                return exception.Message;
            }
            return GetExceptionMessage(exception.InnerException);
        }
    }
上次更新: 1/3/2021, 9:01:12 PM