.net 监控全局异常统一处理

.net 监控全局异常统一处理

在我们日常开发中用的最多的异常处理无非就是try{}Catch,今天我们在这里使用aop的方式进行异常的统一处理,这样有什么好处吗?结果是必然的,他能使我们在开发额过程中专注于业务逻辑的编写,在不修改原有的业务逻辑的情况下添加异常处理,,话不多说,代码演示

	int fm;
	-----//此处fm会被赋值
    int error = rng.Next(30) / fm;

上面代码可以看到fm这个很有可能没有值或者为零
那么我们会想到用try{}catch来捕获异常,

	try
	{
	    int error = rng.Next(30) / fm;
	}
	catch (Exception err) {
	    _logger.LogError(err.Message);
	}

得到错误
Error: Path:/weatherforecastMessage:Attempted to divide by zero
这是我们想要的结果,没有问题

但是有没有想过如果该系统中有很多类似于这种的代码是不是都要给加trycatch,这样整个系统的很多地方都要依赖于trycatch,耦合度过于高了

解决方法:首先创建一个 CustomExceptionFilter 继承 ExceptionFilterAttribute 并重写 OnException方法。在方法中写自己处理逻辑

代码如下

public class CustomExceptionFilterAttribute: ExceptionFilterAttribute
    {
        private readonly ILogger<WeatherForecastController> _logger;

        public CustomExceptionFilterAttribute(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }
        
        public override void OnException(ExceptionContext context)
        {
            //判断该异常有没有处理
            if (!context.ExceptionHandled)
            {
                _logger.LogError($"Path:{context.HttpContext.Request.Path}Message:{context.Exception.Message}");
                context.Result = new JsonResult(new { 
                    Reslut = false,
                    Msg = "发生异常,请联系管理员"
                });
                context.ExceptionHandled = true;
            }
        }
    }

然后再在Startup下面的ConfigureServices注册这个类

services.AddControllers(o=>o.Filters.Add(typeof(CustomExceptionFilterAttribute)));

此时当程序中有异常,便会进入该方法,我们就能在这里统一管理异常

效果演示

fm此时会报异常

可以看到我这里没有使用任何的trycatch,也没有在这里加入任何一段代码,只是专注一自己的代码编写

异常已被捕获到
异常已被捕获到了
我们在其他的地方出现异常都能被CustomExceptionFilterAttribute捕获到进行统一的处理,大大的减少系统的耦合度

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值