我有一个定义了某些限制的API。因为我使用了Polly c#库来限制对API的调用。以下是我使用的策略。
var _rateLimitPolicy = Policy.RateLimitAsync(10,TimeSpan.FromSeconds(1), 5);
var _retryPolicy = Policy
.Handle<RateLimitRejectedException>(e => e.RetryAfter > TimeSpan.Zero)
.WaitAndRetryAsync(
retryCount: 3,
sleepDurationProvider: (i, e, ctx) =>
{
var rle = (RateLimitRejectedException)e;
return rle.RetryAfter;
},
onRetryAsync: (e, ts, i, ctx) => Task.CompletedTask
);
_wrappedPolicies = Policy.WrapAsync(_retryPolicy, _rateLimitPolicy);
目前,一旦超过重试限制3,它就会抛出RateLimitRejectedException
。如果超出重试限制,我想抛出一个自定义错误。有人知道怎么做吗?
当你想执行_wrappedPolicies
时,你可以调用ExecuteAsync
或ExecuteAndCaptureAsync
方法。
- Former在重试时抛出原始异常
- 后者在失败和成功的情况下捕获
PolicyResult
中的结果
PolicyResult policyExecutionResult = await _wrappedPolicies.ExecuteAndCaptureAsync(...);
在这个结果对象上有一个名为FinalException
的属性。您可以检查它,并根据评估结果抛出自定义异常
if (policyExecutionResult.FinalExecption is RateLimitRejectedException)
throw new CustomException(...);
如果你想抛出一个异常,那么使用System。if语句的异常
:
if(retryLimit>3)
{
throw new System.Exception("Retry Limit exceeded 3.");
}
如果您不希望用抛出的异常中断进程,您可以使用try{}catch(Exception e){}
too