3
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”内部出现未处理的异常错误而失败。

4

1 回答 1

4

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 以减少这种调试噪音的选项。

于 2017-09-01T07:38:01.017 回答