大前端

前端学习之家-大前端

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

基于Aop的方式完成全局的异常统一处理

在我们日常开发中用的最多的异常处理无非就是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捕获到进行统一的处理,大大的减少系统的耦合度

发表评论:

Copyright Your WebSite.Some Rights Reserved.