介绍
实现需要继承IExceptionFilter 或 IAsyncExceptionFilter。
可用于实现常见的错误处理策略。
使用场景
首先讲一下我们为什么要使用异常过滤器 ,如果业务场景复杂,只使用HttpStatusCode,抛出异常后,后期要加很多字段来描述。
那么这种就比较不适合, 我们就可以自己定义一套规则, 比如返回结果必须是 code, data, Message等那我们就要写一个通用数据model。
public class ApiResult
{
public int Code { get; set; }
public string Message { get; set; }
public T Data { get; set; }
}
定义一套自己的code标准, 比如1 成功,0 系统异常, 1xx 某类业务, 2xx 某类业务 。
所以我们在抛出异常的时候需要去处理 ,所以异常过滤器就派上用场了,当然还可以用中间件处理异常,这里就不说了!
使用
新建ExceptionFilter 继承IAsyncExceptionFilter
若要处理异常,将 属性 ExceptionHandled 设置为 或 true 分配 Result 属性。
这将停止传播异常。异常筛选器无法将异常转变为“成功”。只有操作筛选器才能执行该转变。
在处理异常的时候获取到context.Exception就能处理不同的异常类型了!
我这里自定义了一个异常类, 当然实际场景中根据业务来新建你们自己的异常类满足需求就行了了!
public class ServicesException : Exception
{
public override string Message { get; }
public ServicesException(string message) : base(message)
{
this.Message = message;
}
}
ExceptionFilter 类:
public class ExceptionFilter : IAsyncExceptionFilter
{
public Task OnExceptionAsync(ExceptionContext context)
{
// 如果异常没有被处理则进行处理
if (context.ExceptionHandled == false)
{
int code = 0;
if (context.Exception is ServicesException)
{
code = 1;
}
// 定义返回类型
var result = new ApiResult
{
Code = code,
Message = context.Exception.Message,
Data=""
};
context.Result = new ContentResult
{
// 返回状态码设置为200,表示成功
StatusCode =(int)HttpStatusCode.OK,
// 设置返回格式
ContentType = "application/json;charset=utf-8",
Content = JsonConvert.SerializeObject(result)
};
}
// 设置为true,表示异常已经被处理了
context.ExceptionHandled = true;
return Task.CompletedTask;
}
}
最后我们将异常过滤器注册到全局即可!(局部注册可参看)
services.AddControllers(o => o.Filters.Add(typeof(ExceptionFilter)));
测试代码与结果: