ASP.NET Core 全局异常处理和日志记录

添加自定义业务异常类

public class BusinessException : Exception
{
    public BusinessException(){}
    public BusinessException(string message) : base(message)
    {}
    public BusinessException(string message, Exception innerException) : base(message, innerException)
    {}
}

添加全局异常过滤器

  • 自定义内部错误响应结果
public class InternalServerErrorObjectResult : ObjectResult
{
    public InternalServerErrorObjectResult(object value) : base(value)
    {
        StatusCode = StatusCodes.Status500InternalServerError;
    }
}
  • 自定义响应结果模型
public class JsonErrorReponse
{
    public string Message { get; set; }
    public string DeveloperMessage { get; set; }
}
  • 全局异常过滤器
public class GlobalExceptionFilter : IExceptionFilter
{
    private readonly IWebHostEnvironment _env;
    private readonly ILogger<GlobalExceptionFilter> _logger;
    public GlobalExceptionFilter(IWebHostEnvironment env, ILogger<GlobalExceptionFilter> logger)
    {
        _env = env;
        _logger = logger;
    }
    public void OnException(ExceptionContext context)
    {
        var json = new JsonErrorReponse();
        if (context.Exception.GetType() == typeof(BusinessException))
        {
            json.Message = context.Exception.Message;
            context.Result = new BadRequestObjectResult(json);
        }
        else
        {
            json.Message = "服务器发生了意外的内部错误";
            if (_env.IsDevelopment())
            {
                json.DeveloperMessage = context.Exception.StackTrace;
            }
            context.Result = new InternalServerErrorObjectResult(json);
        }
        _logger.LogError(context.Exception, context.Exception.Message);
        context.ExceptionHandled = true;
    }
}

向容器添加服务

public void ConfigureServices(IServiceCollection services)
{            
	services.AddMvc(options => options.Filters.Add(typeof(GlobalExceptionFilter)));
}
发布了125 篇原创文章 · 获赞 37 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/zhaobw831/article/details/104380655