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”中出现未处理的异常错误。
答案 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以减少此调试噪音的选项。