当前位置:首页 » .NET编程经验 » 正文

.NET Core过滤器之异常过滤器(ExceptionFilter)

2023年4月22日 16:52:21  分类: .NET编程经验  参与: 人  点这评论

首先需要定义一个过滤器类,如命名为: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

本文标签:.NET Core  Filters    

<< 上一篇下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

搜索

网站分类

Tags列表

最新留言

微信公众号【双语悦读】

    【个人微信】

站点地图 | 网站标签 | 给我留言

Copyright © 2014-2022 timegowhere.com. All rights reserved. 粤ICP备15081222号