我执行对不太稳定的外部服务的调用,因此抛出 WebException。
我想重试几次,在最后一次尝试后我想抛出收到的最后一个错误。
public static Policy WaitAndRetryPolicy<T>(short nrOfRetryAttempts = 5) where T : Exception
{
var waitAndRetry = Policy
.Handle<T>()
.WaitAndRetry(nrOfRetryAttempts, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
var fallbackForLastError = Policy
.Handle<T>()
.Fallback(
fallbackAction: () => { },
onFallback: (ex) => { throw ex; });
return Policy.Wrap(fallbackForLastError, waitAndRetry);
}
Run Code Online (Sandbox Code Playgroud)
调用者,旧版 VB.Net:
Dim retryPolicy = Policies.WaitAndRetryPolicy(Of WebException)()
Dim theResult = retryPolicy.
ExecuteAndCapture(Function()
Return aProxy.GetSomething(a, b)
End Function).Result
Run Code Online (Sandbox Code Playgroud)
当我运行上面描述的代码时,结果保持为空,并且似乎没有调用该服务。如果我只使用 WaitAndRetryPolicy 而不使用Fallback函数,则会调用该服务并且重试机制按预期工作(当然不会引发异常)。
如何实现我的目标,而无需检查调用者代码中的PolicyResult.FinalException ?
要让 Polly 重新抛出任何最终异常,而不是将其捕获到 中,只需使用or重载PolicyResult.FinalException执行策略,而不是or.Execute(...).ExecuteAsync(...).ExecuteAndCapture(...).ExecuteAndCaptureAsync(...)