代码未处理 TimeoutException,使用 Polly 时是否需要 try catch?

TimeoutException unhandled by the code, do I need a try catch when using Polly?

我一直在通过不可靠的 and/or 慢速 VPN 使用远程 Web 服务,当我调用 Web 服务时,我的代码出现了一个故障点,我将收到超时异常。我用谷歌搜索了一下,发现 Polly 似乎正是我所需要的,但我仍然遇到未处理的 TimeoutException,想知道我做错了什么以及如何更新代码以便处理 TimeoutException,最好使用 Polly。

        var networkPolicy = Policy
              .Handle<TimeoutException>()
              .Or<CommunicationException>()
              .WaitAndRetry(
                   5,
                   retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
                   (exception, timeSpan, context) =>
                   {
                        System.Diagnostics.Debug.WriteLine("Exception being retried" + exception );
                   });
        // The following line is giving me the exception.
        response = networkPolicy.Execute(() => soapClient.WebServiceFunction(request));

我还想知道将策略定义为静态只读变量是否是最佳做法?

Polly 的工作原理是,如果发生错误,则重复操作,但仅限于一定次数。如果这个错误出现的次数多了 Polly 就会抛出它。

如果你想重复它直到它没有被抛出,那么使用 RetryForever。

通常我使用带有 try catch 的 Polly - 就像这里:

    try
    {
        return
            await
            Policy.Handle<MongoConnectionException>()
                  .RetryAsync(3,
                      (exception, i) =>
                          {
                              logger.Warn(exception,
                                  string.Format("Mongo Connection Exception - Retry Count : {0}", i));
                          })
                  .ExecuteAsync(async () => await operation());
    }
    catch (MongoConnectionException ex)
    {
        logger.Error(ex);
        return null;
    }