2017-08-31 27 views
0
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

使用DebuggerStepThrough属性注释RunWithPolly方法解决了问题。任何人都可以帮我理解为什么是这样吗? – vmn

+0

已经回答了问题,但出于兴趣:您正在使用哪个版本的VStudio? –

回答

1

TL; DR您刚刚看到VS调试器违反异常。

回复:

当我执行此,它总是失败,未处理的异常错误内部函数“RunWithPolly”在第一个运行本身

什么你看到的是不是波利或执行失败。您刚刚看到调试器违反了抛出的DivideByZeroException(在您决定是否/如何使用调试器控件继续执行之前向您展示它)。

回复:

与DebuggerStepThrough属性诠释方法RunWithPolly解决了这个问题

这并没有改变或 '修复' 关于执行什么。它简单地停止了调试器打破异常,使其看起来好像某些操作有所不同。

为了验证这一点你自己,你能代替你的声明波莉政策:

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