Начиная с основ Polly

Я новичок в Полли и пытаюсь понять, как работает, начиная с самых основ.

Чтобы проверить повторные попытки, я попытался создать код (Print) с 33% для генерации исключения DivideByZeroException. Когда сгенерирована ошибка, она поднимается до policy.Execute, похоже, не управляется 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);
    }
}

person user1812102    schedule 03.10.2020    source источник
comment
Можете ли вы добавить пример того, что вы видите, по сравнению с тем, что вы ожидаете увидеть? Обратите внимание: поскольку вы используете Random, исключение может не возникнуть.   -  person ErikHeemskerk    schedule 03.10.2020
comment
Попробуйте создать Random один раз как одну статическую переменную вместо создания нового Random при каждом запуске Print.   -  person Theodor Zoulias    schedule 03.10.2020


Ответы (1)


Если вы установите b = 0, вместо использования Random, вы увидите, что он обрабатывает исключение, но не повторяет попытки вечно - вы увидите, что он напечатает вывод дважды, прежде чем произойдет сбой. Таким образом, это означает, что в случае использования Random он иногда устанавливает b на 0 несколько раз подряд, и в этом случае политика исчерпывает свои повторные попытки и поэтому выбрасывает.

Вы можете настроить политику для увеличения количества повторных попыток, используя Retry(n). В качестве альтернативы вы можете использовать RetryForever().

Если вы не хотите, чтобы ваш вызывающий код выдавал, когда количество повторных попыток исчерпано, вы можете вместо этого использовать захват результата:

var result = policy.ExecuteAndCapture(() => Print());
if (result.Outcome == OutcomeType.Failure)
{
    // result.FinalException contains the exception
}
person John H    schedule 03.10.2020
comment
Спасибо за ответ ... с .Retry (1) кажется, работает ... Я представлял, что .Retry () похож на Retry (1), но, похоже, я ошибался. - person user1812102; 03.10.2020
comment
@ user1812102 Retry() совпадает с Retry(1). Вы установили b = 0? Если нет, вы просто бросаете кости с Random относительно того, работает это или нет. - person John H; 03.10.2020
comment
Может быть, я запутался, глядя на вывод после ошибки, в любом случае теперь кажется ясным ... - person user1812102; 03.10.2020