Polly善用Context来记录异常发生时的参数信息

2024-02-01 07:48

本文主要是介绍Polly善用Context来记录异常发生时的参数信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Polly是一个.NET弹性和瞬态故障处理库,具体用法可以参考:https://github.com/App-vNext/Polly,此处不会细讲如何使用Polly来进行异常处理或重试,就如标题所说,本篇内容主要为异常发生时除了Exception,又如何获取记录发生异常时你可能关心的数据信息

可能你们会觉得这么简单的问题有什么好说的,直接在方法内try catch记录后,再throw不就行了?当然这的确是一个实际的方法,但作为一个有追求的码农,每个Policy执行的方法都写一段try catch来进行日志记录,这么low的行为,实在……

好像废话多了,直奔主题吧,在使用Polly的时候,我们可以注意到所有的Policy都具备一个叫onXXX的委托,以RetryPolicy为例,在其所有重载方法中,一定会有最后一个参数叫onRetry的重载方法,该委托最多参数定义如下Action<Exception, TimeSpan, int, Context>,可见该委托包含了Exception发生的异常,然后还有一个重要参数就是Context,这个上下文在这里非常关键,还是以抽象类Policy的Execute方法为例,其重载方法除了包含带Context的Action外,本身也具备直接的Context参数,所以我们可以在对应Action中将请求参数传入Context,而Execute方法直接自带的Context则可以用来传入基础的参数,下面则是用于演示的demo代码

            //为方便测试,这里定义一个通用的委托,来模拟日志记录行为Action<Context,Exception, string> act = (c,e, s) =>{var color = Console.ForegroundColor;Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine("LOG******{0}******LOG", s);foreach (var k in c.Keys)Console.WriteLine("Key:{0}  Value:{1}", k, c[k]);Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine("Exception:{0}", e);//记录日志,这里日志就可以通过context来记录更精准的方法信息Console.ForegroundColor = color;};var fallBackPolicy = Policy.Handle<Exception>().Fallback((c, ct) => { }, (e, c) =>{//https://github.com/App-vNext/Polly/wiki/Fallbackact(c, e, string.Format("FallBack context contains keys:{0}", c.Keys.Count));});var timeoutPolicy = Policy.Timeout(5, Polly.Timeout.TimeoutStrategy.Pessimistic, (c, ts, t) =>{//https://github.com/App-vNext/Polly/wiki/Timeout//因为此处测试我们并没指定CancellationToken ,所以这里采取悲观策略act(c, new TimeoutException(), string.Format("Timeout context contains keys:{0}", c.Keys.Count));//Timeout比较特殊,因为异常不是发生在代码中,所以此处我们直接new了一个异常传入});fallBackPolicy.Execute(c =>{//因为timeout会产生异常,所以这里用FallBack包含下,不然后面的retryPolicy就无法执行了timeoutPolicy.Execute((ct) =>{Thread.Sleep(6000);}, new Dictionary<string, object> { { "Action", "timeoutPolicy" } });}, new Dictionary<string, object> { { "Action", "fallBackPolicy" } });var retryPolicy = Policy.Handle<Exception>().WaitAndRetry(5, (i, c) =>{//获取timespan的委托中,我们对context进行调整以进行测试Console.WriteLine("------------------");Console.WriteLine("Add key:{0} into context in sleepDurationProvider action", i);c.Add(i.ToString(), i.ToString());//c[i.ToString()] = i;//也可以直接这样进行赋值return TimeSpan.FromSeconds(5);}, (e, t, c) =>{act(c, e, string.Format("OnRetry context contains keys:{0}", c.Keys.Count));});retryPolicy.Execute(() =>{throw new Exception("just test");}, new Dictionary<string, object> { { "Action", "retryPolicy" } });

执行截图如下


这样,就可以将所有的异常统一进行log记录,而且log也包含了当前方法的相关参数信息

这篇关于Polly善用Context来记录异常发生时的参数信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666571

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回