代码未处理 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;
}
我一直在通过不可靠的 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;
}