程序猿改变世界
首先需要定义一个过滤器类,如命名为:MyExceptionFilter,继承IExceptionFilter(同步)或IAsyncExceptionFilter(异步)接口,如:
OnExceptionAsync代码参考如下:
public Task OnExceptionAsync(ExceptionContext context) { ObjectResult result; context.HttpContext.Response.StatusCode = 500; //判断是否是开发环境 if (webHostEnvironment.IsDevelopment()) { //定义返回到客户端的结果 result = new ObjectResult(new { StatusCode = context.HttpContext.Response.StatusCode, Message= context.Exception.ToString() }); } else { result = new ObjectResult(new { StatusCode = context.HttpContext.Response.StatusCode, Message="服务器发生未处理的异常" }); } //返回给客户端的结果 context.Result = result; //标识该异常是否被处理过,设置为true后,其他异常过滤器将不再处理 context.ExceptionHandled = true; return Task.CompletedTask; }
然后在Program.cs中注册自定义的异常过滤器即可:
builder.Services.Configure<MvcOptions>(options => { //注册自定义的异常过滤器 options.Filters.Add<MyExceptionFilter>(); });
如果有多个异常过滤器,执行顺序是和注册的顺序相反的,例如,我再定义一个LogExceptionFilter,并注册到过滤器中:
builder.Services.Configure<MvcOptions>(options => { //注册自定义的异常过滤器 options.Filters.Add<MyExceptionFilter>(); options.Filters.Add<LogExceptionFilter>(); });
并且将ExceptionHandled 设置为 false,防止其他异常过滤器不执行
context.ExceptionHandled = false;
打印下控制台输出:
最后控制台输出如下:
也就是后注册的先执行,如果后注册的(以这个例子为例就是LogExceptionFilter)过滤器中的“ExceptionHandled”设置为 true,那么MyExceptionFilter将不会执行。
来源:时间去哪儿了博客(微信/QQ号:903918446),转载请保留出处和链接!
本文链接:http://timegowhere.com/post/netcore-exception-filter.html
【个人微信】
【时间去哪儿了】
教育类博客,关注知识的分享与交流。
欢迎关注公众号!
加我微信
Copyright © 2014-2022 timegowhere.com. All rights reserved. 粤ICP备15081222号