【发布时间】:2021-05-21 11:46:38
【问题描述】:
鉴于此代码尝试调用 AuthenticationManager.Authenticate() 10 次,然后在 10 次尝试失败后抛出 CustomException:
string res = Policy
.Handle<Exception>() // Handles any exception
.OrResult<string>(result => string.IsNullOrWhiteSpace(result)) // or if result is null
.Fallback(() => throw new CustomException("Exception!")) // Not being thrown after 10 unsuccessful attempts
.Wrap(
Policy
.Handle<Exception>()
.OrResult<string>(result => string.IsNullOrWhiteSpace(result))
.WaitAndRetry(
10,
retryAttempt => TimeSpan.FromSeconds(60),
onRetry: (response, delay, retryCount, context) => Trace.WriteLine($"[{DateTime.UtcNow}] Authentication failed. Retrying after 60 seconds...(Attempt {retryCount} of 10)")))
.ExecuteAndCapture(() => AuthenticationManager.Authenticate())
.Result;
为什么CustomException 没有从回退操作中抛出?正确的做法应该是什么?
【问题讨论】:
-
您是否对您的策略进行单元测试? "请注意,.ExecuteAndCapture/Async(...) 会捕获整个执行结果是否是被策略视为失败的结果。因此,如果您的 FallbackPolicy 将失败结果替换为将被视为失败的结果成功(正如许多后备策略所做的那样 - “优雅降级”模式),然后 .ExecuteAndCapture/Async(...) 自然会报告 PolicyResult.Outcome == OutcomeType.Success。” - FallbackPolicy with ExecuteAndCapture()
-
^^这可能是个问题吗?
-
我只是将您的代码放入 xUnit-Test 并发现它“有点”工作:
Outcome是Failure,Result是null和FinalException是 @987654333 @. -
ExecuteAndCapture不会抛出异常。它捕获委托的结果,即使是Tx或任何类型的Exception。Outcome会告诉你它是成功还是失败。如果失败,您可以通过FinalException、Reference访问异常
标签: c# exception polly resiliency transient-failure