# 异常处理
异常处理我是使用中间件的方法实现的,这种方法会比异常过滤器的范围更大,使用起来也更优雅。
我在WebApi
创建一个ApiExceptionMiddleware
类,原理非常简单。就是套一层try
,catch
。
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);
}
}