代码之家  ›  专栏  ›  技术社区  ›  Justin Helgerson

如果不满足结果条件,策略是否可以引发异常?

  •  0
  • Justin Helgerson  · 技术社区  · 7 年前

    我想使用polly来处理我需要进行的HTTP API调用的结果。我将政策定义为:

    var r = await Policy
        .HandleResult<DescribeApplicationVersionsResponse>(x => x.ApplicationVersions[0]?.Status != ApplicationVersionStatus.Processed)
        .WaitAndRetryAsync(10, retryAttempt => TimeSpan.FromSeconds(1), onRetry: (describeResponse, timeSpan, context) => {
            Console.WriteLine($"Application version was '{describeResponse.Result.ApplicationVersions[0].Status}', retrying in {timeSpan}");
        })
        .ExecuteAsync(() =>
            BeanstalkClient.DescribeApplicationVersionsAsync(describeApplicationVersionRequest)
        );
    

    如果策略从未成功(即,结果条件从未满足,并且已超过重试限制),我希望引发异常,因为我的应用程序无法继续。

    是否可以通过polly策略生成器扩展方法定义这一点?

    1 回复  |  直到 7 年前
        1
  •  2
  •   mountain traveller    7 年前

    如果为Polly重试策略配置的所有重试都已用尽,而执行的委托未成功,则重试策略将重新引发异常,不允许再次重试,如文档所示。 in the Polly readme (重试区底部)和 Polly retry wiki .


    如果要引发与委托传播的异常不同的异常,可以执行以下任一操作:

    • try / catch 扔别的东西;(或)
    • 使用Polly .ExecuteAndCapture(...) 捕获,然后检查最终执行结果,并抛出自己的自定义异常;(或)
    • 使用 PolicyWrap 包装 FallbackPolicy 在重试策略之外,在FallbackPolicy中,处理重试失败的异常,并在Fallback操作中,重新引发另一个自定义异常。

    编辑 :反映操作的原始策略正在处理结果,而不是异常。一种使用 后备政策 具有 保险单包装 可能如下:

    var retry = Policy
        .HandleResult<DescribeApplicationVersionsResponse>(x => x.ApplicationVersions[0]?.Status != ApplicationVersionStatus.Processed)
        .WaitAndRetryAsync(10, retryAttempt => TimeSpan.FromSeconds(1), onRetry: (describeResponse, timeSpan, context) => {
            Console.WriteLine($"Application version was '{describeResponse.Result.ApplicationVersions[0].Status}', retrying in {timeSpan}");
        });
    
    var fallback = Policy
        .HandleResult<DescribeApplicationVersionsResponse>(x => x.ApplicationVersions[0]?.Status != ApplicationVersionStatus.Processed) // Probably worth factoring the predicate out into a method so that it is only stated once.
        .FallbackAsync(async () => { throw new ReplacementException(); });
    
    var r = await fallback.WrapAsync(retry)
        .ExecuteAsync(() =>
       BeanstalkClient.DescribeApplicationVersionsAsync(describeApplicationVersionRequest)
    );