如何在Polly限流重试超限后抛出自定义异常?
实现重试失败后抛出自定义限流异常
你可以通过添加异常转换策略,在Polly的策略链中捕获最终的RateLimitRejectedException,并将其替换为自定义异常。具体实现步骤如下:
1. 定义自定义异常类
先创建专属的异常类型,用来标识API调用限流超过重试次数的场景:
public class ApiRateLimitExceededException : Exception { public ApiRateLimitExceededException(string message, Exception innerException) : base(message, innerException) { } }
2. 创建异常转换策略
编写一个Polly策略,专门捕获重试失败后抛出的RateLimitRejectedException,并将其替换为自定义异常:
var _exceptionConversionPolicy = Policy .Handle<RateLimitRejectedException>() .ThrowAsync((ex, ctx) => new ApiRateLimitExceededException("API调用次数超限,重试已耗尽", ex) );
3. 调整策略链包裹顺序
将异常转换策略放在策略链的最外层,确保所有经过重试仍失败的限流异常都会被转换:
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(_exceptionConversionPolicy, _retryPolicy, _rateLimitPolicy);
逻辑说明
- 当限流策略触发
RateLimitRejectedException时,重试策略会按配置尝试3次重试 - 若3次重试全部失败,重试策略会将原生的
RateLimitRejectedException向上抛出 - 最外层的异常转换策略捕获该异常后,立即抛出自定义的
ApiRateLimitExceededException,完成异常替换
这样当重试次数耗尽后,系统就会抛出你定义的自定义异常,而非Polly原生的限流异常。
内容的提问来源于stack exchange,提问作者Kavin404
相关产品推荐
相关产品推荐

