0

我正在使用 Polly 重试策略在抛出异常时重试。这里我试图在循环中使用该重试策略。因此,在执行 foreach 循环时,如果它抛出任何异常,则 Polly 重试。这部分工作正常。但我想继续重试后循环内的下一次迭代。但在2次重试后抛出最终异常并返回调用方法。

static void Main(string[] args)
    {
        RetryPolicy();
    }

    private static void RetryPolicy()
    {
        try
        {
            var retryPolicy = Policy.Handle<Exception>().Retry(2);
            List<int> list = new List<int>();
            list.AddRange(new int[] { 0, 1, 2, 3, 4 });
            foreach(var item in list)
            {
               retryPolicy.Execute(() => Calculate(item));
            }
        }
        catch (Exception ex)
        {
        }
    }

    private static void Calculate(int j)
    {
       int a = 10;
       int b = j;
       var c = a / b;
    }

在第一次迭代中,它给出了错误,在 2 次重试后,我想返回循环并继续每个循环内部的其他项目。有什么方法可以用 Polly 实现这一点。请建议。

4

1 回答 1

2

try/catch在错误的地方 - 它应该在循环内。这样,当 Polly 在最后一次重试后抛出异常时,会捕获并处理异常(请不要使用空捕获),然后循环继续。

但是还有一个更好的方法:删除 try/catch 并使用 ExecuteAndCapture() - 这将返回一个结果,指示总体上是成功还是失败。然后用它做点什么:

private static void RetryPolicy()
{
    var retryPolicy = Policy.Handle<Exception>().Retry(2);
    List<int> list = new List<int>();
    list.AddRange(new int[] { 0, 1, 2, 3, 4 });
    foreach(var item in list)
    {
       var policyResult = retryPolicy.ExecuteAndCapture(() => Calculate(item));
       if (policyResult.Outcome != OutcomeType.Successful) 
       {
           // do something remedial. then the loop can continue.
       }
    }
}
于 2018-02-07T19:13:34.273 回答