Polly 策略记录异常并重新抛出

2024-04-27

我考虑使用Polly https://github.com/App-vNext/Polly#handing-return-values-and-policytresult创建策略来记录异常并重新抛出。 我没有找到允许它开箱即用的现有方法,但我看到的一些选项是

Fallback

// Specify a substitute value or func, calling an action (e.g. for logging)
// if the fallback is invoked.
Policy.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank,
    onFallback: (exception, context) =>
    {
        _logger.Log(exception, context);
        throw exception;
    });

问题:可以从 Fallback 中抛出异常吗?

Timeout

Policy.Timeout(1, T30meoutStrategy.Pessimistic,
(context, timespan, task) =>
{
    // ContinueWith important!: the abandoned task may very well still be executing,
    // when the caller times out on waiting for it!
    task.ContinueWith(t =>
    {
        if (t.IsFaulted)
        {
            logger.Error(context,t.Exception);
            throw exception;
        }
    });
}

Or Retry

Policy.Handle<DivideByZeroException>().Retry(0,
(exception, retryCount) =>
{
    logger.Error(context,exception);
    throw exception;
});

问:是否支持0次重试?

或者亲吻并写下简单的尝试/捕获自己扔。

这些方法中哪种更好? 您有什么建议?


如果您还没有 Polly,那么 try/catch 似乎是最简单的。

如果你已经有了波莉,FallbackPolicy https://github.com/App-vNext/Polly/wiki/Fallback可以按照您建议的方式安全地重新调整用途。这onFallback委托和后备操作或值不受.Handle<>()保单条款 https://github.com/App-vNext/Polly/blob/089e7b51bf9970668bb1ca87ad9ea6ed401dbaed/src/Polly.Shared/Fallback/FallbackEngine.cs#L44-L46,因此您可以安全地从内部重新抛出异常onFallback代表。

Policy<UserAvatar>.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank,
    onFallback: (exception, context) =>
    {
        _logger.Log(exception, context);
        throw exception;
    });

您的问题概述的方法TimeoutPolicy https://github.com/App-vNext/Polly/wiki/Timeout只会捕获调用者之前因超时而离开的委托抛出的异常,并且仅在TimeoutMode.Pessimistic;并非所有例外。


您的问题概述的方法.Retry(0, ...)行不通。如果未指定重试,则onRetry委托将不会被调用。


避免重新调整用途的混乱FallbackPolicy,您也可以编写自己的代码LogThenRethrowPolicy,在 Polly 的结构内。这次提交 https://github.com/App-vNext/Polly/commit/98bc9317e2c050702f91b2df31c3b653c458f3a7(其中添加了简单的NoOpPolicy https://github.com/App-vNext/Polly/wiki/NoOp) 举例说明了添加新策略所需的最低限度。您可以添加类似于的实现NoOpPolicy只是try { } catch { /* log; rethrow */ }


编辑 2019 年 1 月:Polly.Contrib 现在还包含Polly.Contrib.LoggingPolicy https://github.com/Polly-Contrib/Polly.Contrib.LoggingPolicy这可以帮助解决这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Polly 策略记录异常并重新抛出 的相关文章

  • 为什么 PCRE 正则表达式比 C++11 正则表达式快得多

    一些示例代码 这是使用 cregex iterator 的 c 11 部分 std chrono steady clock time point begin0 std chrono steady clock now regex re
  • C++:创建一个由用户输入大小的数组

    我想知道我们是否可以创建一个具有用户指定大小的数组 Ex int a cout lt lt Enter desired size of the array cin gt gt a int array a 上面的程序将不起作用 因为数组大小必
  • 如何在样式中访问控件父级的属性

    我的列表视图将项目数据模板化为标签 我正在为该标签设计一种样式 但我不知道如何访问父级的 ListViewItem IsSelected 属性 编辑 尝试了下面的建议 但仍然出现异常 这是我的完整代码
  • 在 C/C++ 中读取和写入二进制文件的中间部分

    如果我有一个大的二进制文件 假设它有 100 000 000 个浮点数 C 或 C 有没有办法打开文件并读取特定的浮点数 而不必将整个文件加载到内存中 即我如何快速找出第 62 821 214 个浮点是什么 第二个问题 有没有办法更改文件中
  • 为什么仍然需要在 using 语句的 RHS 中使用 typename 来消除依赖类型的歧义?

    我很清楚为什么需要使用typename对于依赖类型 因为编译器在看到类似的内容时可能无法消除类型和变量声明之间的歧义T type 参见例如这个答案 https stackoverflow com a 613132 3093378一个很好的解
  • 当 TestCase 包含数组时,NUnit 无法识别该 TestCase

    这是我在 NUnit 中遇到的非常简单但烦人的行为 我有一些这样的测试 Test TestCase 1 2 hello TestCase 3 5 goodbye public void MyClass MyMethod int a int
  • Mono 和 WebRequest 速度 - 测试

    在 mono 4 6 2 linux 中 我注意到 wget 下载文件的速度与webclient DownloadString 所以我做了一个小测试来调查 为什么 wget 明显比 C 快 根据我自己的实验 使用 wget 下载 手动读取文
  • 单击按钮本地化应用程序

    我在我的项目 mainMaster 页面中找到了 imageButtons
  • 如何获得字符串的所有字谜

    我试图找到一个字符串的所有可能的字谜并仅使用递归将它们存储在数组中 我被困住了 这就是我所拥有的一切 int main const int MAX 10 string a ABCD string arr 10 permute arr a 0
  • 无法将方法组分配给 asp.net、linq、c# 中的隐式类型局部变量

    public void selectqueryasso CustomerOrderResult cso new CustomerOrderResult var a from as1 in ds orders from as2 in ds o
  • 慢速 WPF 文本框

    我正在开发一个简单的串行数据查看器 它将用于观察传输到计算机串行端口之一的数据 我使用 C 和 WPF 编写了一个测试应用程序 它只是将最近读取的行放入文本块中 但是 它会跳过所有其他行 我的理论是 在 WPF 渲染窗口之前 新数据会被放入
  • 树结构的序列化/反序列化

    我试图找出保存 序列化 并稍后打开 反序列化 树结构的最佳方法 我的结构由具有不同属性的各种对象类型组成 但每个对象类型都继承自基本抽象 Node 类 每个节点都有唯一的 ID GUID 并且有一个 AddSuperNode Node nd
  • WinForms TreeView - 如何手动“突出显示”节点(就像被单击一样)

    我需要知道如何让以编程方式选择的节点以图形方式处于 选定 状态 就像用户单击它一样 SelectedNode 仅使这一节点在内部被选中 非常感谢 它没有显示为突出显示的原因是由于树视图没有焦点 这是我的测试表单上的按钮单击事件 TreeVi
  • 如何在 Datagridview 中为图像列提供超链接

    如何在winforms中超链接到DataGridViewImageColumn OP 评论中的代码示例 DataGridView dgv new DataGridView dgv Name dgv i dgv DataSource dsMa
  • 如何存储将被多个不同类访问的字符串常量? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关于堆栈溢出有太多不同的答案 声明一个命名空间 并在 hpp 文件中将所有字符串标记为 extern const 并在 cpp 文件中放置它们的
  • 在C中更改函数内的数组

    我正在学习 C 并且很困惑为什么在 main 中创建的数组不会在函数内部更改 我假设传递的数组是一个指针 并且更改指针应该更改数组 对吧 有人可以解释这种情况下发生了什么吗 谢谢你的帮助 int main int i length 10 i
  • 在 asp.net MVC 控制器中调用异步外部 Web 服务

    在 Asp net MVC 控制器 GET 方法 中 我调用外部 Web 服务 用于 IP 地理定位 返回 IP 位置的 json 数据 如何使调用异步 以便堆栈可以在等待服务响应时继续 当 GEO IP 请求完成后 我希望能够更新数据库
  • 如何在 MVC 5 中设置自定义 ClaimsPrincipal?

    我创建了一个自定义主体类 public class FacebookPrincipal ClaimsPrincipal public JObject Data get set 我想用它 当用户登录时 我尝试设置 var fbP new Fa
  • WCF - IsOneway 的行为不像 Oneway 操作

    我已在服务的某些方法上定义了 OneWay 属性 但它们的行为并不像 Oneway 调用 我的客户等待呼叫完成并从服务返回 我假设单向操作是非阻塞操作 并且客户端不关心被调用函数会发生什么 它只是调用并忘记它 这是对的吗 问题 调用 Ope
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功

随机推荐

  • 在 MVC 5 中,如何在单个 Ajax POST 请求中发送 ViewModel 和文件?

    我有一个 ASP NET MVC 5 应用程序 我正在尝试发送带有模型数据的 POST 请求 并且还包括用户选择的文件 这是我的 ViewModel 为了清晰起见进行了简化 public class Model public string
  • 给GAC,还是不给GAC?

    我有一个用 ASP NET 3 5 编写的数据访问层 DAL 并使用 Microsoft 模式和实践库 以下简称 P P 来完成其数据访问 我安装了 P P 它驻留在我的 GAC 中 因此 从逻辑上讲 我的 DAL 在 GAC 中引用它 因
  • `checkout` = `reset` + `symbolic ref`?

    Suppose a branch是一个现有分支 指向与之前不同的提交HEAD指着 HEAD可能直接或通过某些方式指向提交branch 以下命令等效吗 git checkout a branch and git symbolic ref HE
  • 分布式张量流中的并行进程

    我有带有训练参数的张量流神经网络 它是代理的 策略 网络正在核心程序的主张量流会话的训练循环中进行更新 在每个训练周期结束时 我需要将该网络传递给几个并行进程 工作人员 这些进程将使用它来从代理策略与环境的交互中收集样本 我需要并行执行 因
  • 没有传输安全性的 WCF 可靠会话不会按时发生故障事件

    我遇到了可靠会话的一个非常有趣的行为 我使用的是netTcp绑定 双工通道 可靠会话 当我尝试侦听channel faulted时 如果安全模式设置为transport 则当客户端断开连接时 故障事件将立即触发 但是 当我将绑定的安全模式设
  • 在实体框架中附加集合

    使用实体框架 我可以使用附加单个对象 entity Attach 但是 我没有看到任何方法允许我将多个对象的集合 数组添加到实体 我必须循环遍历集合中的每个项目并调用entity Attach 每一次 是的 您必须循环遍历子集合并Attac
  • 在 MySQL 中存储 IPv6 地址

    正如 需要支持 ipv6 的 inet aton 和 inet ntoa 函数 http bugs mysql com bug php id 34037 目前没有用于存储 IPv6 地址的 MySQL 函数 用于存储 插入的推荐数据类型 函
  • 如何在 CSS 中用 SVG 图标替换 Web 字体(Font Awesome)?

    我注意到在我的 CSS 文件中 有一些使用 Font Awesome Web 字体的规则 如下所示 ul fancy li before category page ul li before display none font style
  • 删除URL参数而不刷新页面

    我试图删除 之后的所有内容在文档准备好的浏览器 URL 中 这是我正在尝试的 jQuery document ready function var url window location href url url split 0 我可以做到
  • toLocaleLowerCase() 和 toLowerCase() 之间的区别[重复]

    这个问题在这里已经有答案了 我试图fiddle http jsfiddle net xameeramir kr33b0aL with toLocaleLowerCase http www w3schools com jsref jsref
  • 如何退出 Instagram API?

    Instagram API 身份验证页面没有任何有关如何注销用户的信息 在使用 API 的 iOS 应用程序上 我该如何允许用户注销 要注销用户 您只需删除令牌即可 如果用户不希望您的应用访问他们的数据 他们将取消您的应用访问权限 如果您想
  • 编写无 BOM 的 UTF-8

    这段代码 OutputStream out new FileOutputStream new File C file test txt out write A getBytes 和这个 OutputStream out new FileOu
  • 如何在 CUDA 中执行多个矩阵乘法?

    我有一个方阵数组int M 10 以便M i 定位第一个元素i th 矩阵 我想将所有矩阵相乘M i 通过另一个矩阵N 这样我就收到了方阵数组int P 10 作为输出 我看到有不同的可能性 分配不同元素的计算M i 到不同的线程 例如 我
  • ASP.NET MVC。如何禁止在 URL 中显示默认文化?

    这是问题 我有一个本地化的 asp net mvc 网站 本地化通过以下步骤完成 1 对于每条路线 我自动添加一个 culture url 段 默认值为 ru 我希望我的网址仅包含外国文化 例如 http mysite com ua con
  • git commit 找不到在 cron 作业中运行的(全局)配置

    我想使用 cron 作业提交一些文件更改 调用一个脚本 并在 root crontab 中使用以下行 0 cd files backup sh gt tmp cronlog 2 gt tmp cronerror 该脚本如下所示 usr bi
  • 如何从 Java 中的字符串表示形式获取 Locale?

    有没有一种巧妙的方法来获得Locale http java sun com javase 6 docs api java util Locale html来自 Locale 返回的 编程名称 的实例toString 方法 一个明显且丑陋的解
  • Javascript 递增运算求值顺序

    我知道后缀 前缀递增 递减运算符的作用 而在 javascript 中 这似乎没有什么不同 虽然我可以很容易地猜出这一行的结果 var foo 10 console log foo foo foo foo foo output 10 11
  • 导航栏按钮点击区域无法正常工作(图像不可点击)

    Xcode 11 4 iOS 13 4 导航栏 UIBarButton 项目未按预期工作 我使用故事板作为按钮 没有编写代码 我更新 Xcode 后它工作得很好 现在它不起作用了 只能触摸绿色区域 图片can not 我还检查了屏幕调试器
  • jQuery - 如何动态添加验证规则

    我正在尝试向某些动态控件动态添加验证规则 input id Hours rules add required 但是这一行给了我以下错误 data element form validator 为 null 使用验证函数以静态方式定义规则效果
  • Polly 策略记录异常并重新抛出

    我考虑使用Polly https github com App vNext Polly handing return values and policytresult创建策略来记录异常并重新抛出 我没有找到允许它开箱即用的现有方法 但我看到