You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:35:52