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)));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章