TimeoutException未被代码处理,在使用Polly时我需要try catch吗?

时间:2015-10-14 20:42:57

标签: c# exception-handling polly

我一直在通过一个不可靠和/或速度慢的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));

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

1 个答案:

答案 0 :(得分:1)

Polly工作,以便在发生错误时重复操作,但只有一定次数。如果错误发生的次数多多,Polly会抛出它。

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

通常我会使用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;
    }