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

相关文章

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

Java异常捕获及处理方式详解

《Java异常捕获及处理方式详解》异常处理是Java编程中非常重要的一部分,它允许我们在程序运行时捕获并处理错误或不预期的行为,而不是让程序直接崩溃,本文将介绍Java中如何捕获异常,以及常用的异常处... 目录前言什么是异常?Java异常的基本语法解释:1. 捕获异常并处理示例1:捕获并处理单个异常解释:

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理