【问题标题】:What am I missing in this that Polly is not retrying my action?Polly 没有重试我的操作,我错过了什么?
【发布时间】:2017-09-02 03:08:24
【问题描述】:
public class PollyTest
{
    public void RunWithPolly()
    {
        Console.WriteLine("RunWithPolly invoked...");
        int zero = 0;
        int result= 10 / zero;
    }
}

在我的主要功能中,我创建了一个策略,如下所示:

var retryPolicy = Policy.Handle<DivideByZeroException>().Retry(3);
PollyTest pollyTest = new PollyTest();
retryPolicy.Execute(() => pollyTest.RunWithPolly());

当我执行此操作时,它总是在第一次运行时失败,并在函数“RunWithPolly”中出现未处理的异常错误。

【问题讨论】:

  • 用 DebuggerStepThrough 属性注释方法 RunWithPolly 解决了这个问题。谁能帮我理解为什么会这样?
  • 已回答问题,但出于兴趣:您使用的是哪个版本的 VStudio?

标签: polly


【解决方案1】:

TL;DR 您刚刚看到 VS 调试器因异常而中断。

回复:

当我执行此操作时,它总是在第一次运行时因函数“RunWithPolly”内部出现未处理的异常错误而失败

您看到的不是 Polly 或执行失败。您刚刚看到调试器在抛出 DivideByZeroException 时中断(在您决定是否/如何使用调试器控件继续执行之前向您展示)。

回复:

使用 DebuggerStepThrough 属性注释方法 RunWithPolly 解决了问题

这并没有改变或“修复”关于执行的任何内容。它只是停止了调试器在异常上的中断,使它看起来好像有什么不同的操作。

要向自己验证这一点,您可以将 Polly 政策声明为:

var retryPolicy = Policy
    .Handle<DivideByZeroException>()
    .Retry(3,
        (ex, i) => { Console.Writeline($"Making retry {i} due to {ex.Message}."); }
    );

然后在没有调试器的情况下运行您的示例,您将看到所有重试。使用调试器运行它而没有 [DebuggerStepThrough] 属性,每次调试器中断时只需按 F5/debugger-continue,您将再次看到代码在所有重试中正常工作。 [DebuggerStepThrough] 对执行没有影响,只是对您在调试器中看到的内容。


StackOverflow q/a 描述了相同的场景。

Polly wiki 详细描述了发生这种情况的原因、VS 调试器对“用户未处理”异常的含义、为什么这可能会令人困惑,以及配置不同版本的 Visual Studio 以减少这种调试噪音的选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多