波莉没有重试我的行动,我错过了什么?

What am I missing in this that Polly is not retrying my action?

public class PollyTest
{
    public void RunWithPolly()
    {
        Console.WriteLine("RunWithPolly invoked...");
        int zero = 0;
        int result= 10 / zero;
    }
}

然后在我的 Main 函数中创建如下策略:

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

当我执行它时,它总是在第一个 运行 本身的函数 "RunWithPolly" 内出现未处理的异常错误而失败。

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

回复:

When I execute this, it always fails with unhandled exception error inside function "RunWithPolly" on the very first run itself

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

回复:

Annotating the method RunWithPolly with DebuggerStepThrough attribute resolved the problem

这并没有改变或 'fix' 关于执行的任何事情。它只是停止了调试器中断异常,让它看起来好像有什么不同的操作。

要亲自验证这一点,您可以将 Polly 策略声明为:

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

运行 你的例子没有调试器,你会看到所有的重试。 运行 使用调试器 而没有 [DebuggerStepThrough] 属性,每次调试器中断时只需按 F5/debugger-continue,您将再次正确看到代码通过所有重试。 [DebuggerStepThrough] 对执行没有影响,只是对您在调试器中看到的内容有影响。


描述了相同的场景。

Polly wiki 详细描述了为什么会发生这种情况,VS 调试器对 'user-unhandled' 异常的含义,为什么这会令人困惑,以及配置各种版本 Visual Studio 的选项以减少这种调试噪音。