从Polly基础开始

问题描述

我对Polly还是很陌生,我试图从最基础的角度开始了解其工作原理。

为了测试重试,我尝试创建具有33%的代码(打印)以生成DivideByZeroException。生成错误后,它会提出策略。执行似乎不受Polly的管理。

有人可以帮助我调整此代码吗?我正在使用.Net Framework 4.7.2。

using System;
using Polly;

class Program
{
    static void Main(string[] args)
    {
        var policy = Policy
                        .Handle<DivideByZeroException>()
                        .Retry();

        policy.Execute(() => Print());
        Console.ReadKey();
    }

    private static void Print()
    {
        var rand = new Random();
        int a = rand.Next(1000,2000);
        int b = rand.Next(0,2);
        Console.WriteLine("a = {0} - b {1}",a,b);
        int c = a / b;
        Console.WriteLine("c = {0}",c);
    }
}

解决方法

如果设置b = 0,而不是使用Random,您会看到它正在处理异常,但它不会永远重试-您会看到它打印输出失败之前两次。因此,这意味着,在使用Random的情况下,有时会有时连续将b设置为0,在这种情况下,该策略将耗尽其重试次数,然后抛出。

您可以使用Retry(n)配置该策略以增加重试次数。或者,您可以使用RetryForever()

如果您不想在重试用尽时抛出调用代码,则可以使用捕获结果代替:

var result = policy.ExecuteAndCapture(() => Print());
if (result.Outcome == OutcomeType.Failure)
{
    // result.FinalException contains the exception
}