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

时间:2017-08-31 22:31:45

标签: polly

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”中出现未处理的异常错误。

1 个答案:

答案 0 :(得分:2)

TL; DR您刚刚看到VS调试器在异常情况下中断。

回复:

  

当我执行它时,它总是失败,函数内部出现未处理的异常错误&#34; RunWithPolly&#34;在第一次运行本身

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

回复:

  

使用DebuggerStepThrough属性对RunWithPolly方法进行批注解决了问题

这没有改变或修复&#39;关于执行的任何事情。它只是停止了调试器打破异常,使得它看起来好像有些不同的操作。

要对自己进行验证,您可以将您的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调试器的含义是由用户未处理的&#39;异常,为什么这可能令人困惑,以及配置各种版本的Visual Studio以减少此调试噪音的选项。