Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果结果标准从未满足,策略是否可以引发异常?_C#_Polly - Fatal编程技术网

C# 如果结果标准从未满足,策略是否可以引发异常?

C# 如果结果标准从未满足,策略是否可以引发异常?,c#,polly,C#,Polly,我想使用Polly来处理我需要进行的HTTP API调用的结果。我将该政策定义为: var r = await Policy .HandleResult<DescribeApplicationVersionsResponse>(x => x.ApplicationVersions[0]?.Status != ApplicationVersionStatus.Processed) .WaitAndRetryAsync(10, retryAttempt =>

我想使用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)
    );
var r=等待策略
.HandleResult(x=>x.ApplicationVersions[0]?.Status!=ApplicationVersionStatus.Processed)
.WaitAndRetryAsync(10,RetryAtt尝试=>TimeSpan.FromSeconds(1),onRetry:(描述响应,TimeSpan,上下文)=>{
Console.WriteLine($”应用程序版本为“{DescriberResponse.Result.ApplicationVersions[0].Status}”,正在{timeSpan}中重试”);
})
.ExecuteAsync(()=>
BeanstalkClient.DescribeApplicationVersionAsync(describeApplicationVersionRequest)
);
如果策略从未成功(即,从未满足结果标准且已通过重试限制),我希望抛出异常,因为我的应用程序无法继续


可以通过Polly policy builder扩展方法定义吗?

如果为Polly重试策略配置的所有重试都已完成,而执行的委托未成功,则重试策略将重新引发不允许再次重试的异常,如文件所述(重试部分的末尾)和


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

  • 试试
    /
    抓住
    然后扔点别的东西;(或)
  • 使用Polly捕获并检查最终执行结果,并抛出您自己的自定义异常;(或)
  • 用于在重试策略外部包装异常,在回退策略中,处理重试失败导致的异常,并在回退操作中,重新引发其他自定义异常

已编辑:反映OP的原始策略处理结果而非异常的事实。使用
FallbackPolicy
PolicyWrap
的方法如下:

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)
);
var retry=Policy
.HandleResult(x=>x.ApplicationVersions[0]?.Status!=ApplicationVersionStatus.Processed)
.WaitAndRetryAsync(10,RetryAtt尝试=>TimeSpan.FromSeconds(1),onRetry:(描述响应,TimeSpan,上下文)=>{
Console.WriteLine($”应用程序版本为“{DescriberResponse.Result.ApplicationVersions[0].Status}”,正在{timeSpan}中重试”);
});
风险值回退=策略
.HandleResult(x=>x.ApplicationVersions[0]?.Status!=ApplicationVersionStatus.Processed)//可能值得将谓词分解到一个方法中,以便只声明一次。
.FallbackAsync(async()=>{throw new ReplacementException();});
var r=await fallback.WrapAsync(重试)
.ExecuteAsync(()=>
BeanstalkClient.DescribeApplicationVersionAsync(describeApplicationVersionRequest)
);

如果为Polly重试策略配置的所有重试都已完成,而执行的委托未成功,则重试策略将重新引发不允许再次重试的异常,如文档所述(重试部分的末尾)和


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

  • 试试
    /
    抓住
    然后扔点别的东西;(或)
  • 使用Polly捕获并检查最终执行结果,并抛出您自己的自定义异常;(或)
  • 用于在重试策略外部包装异常,在回退策略中,处理重试失败导致的异常,并在回退操作中,重新引发其他自定义异常

已编辑:反映OP的原始策略处理结果而非异常的事实。使用
FallbackPolicy
PolicyWrap
的方法如下:

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)
);
var retry=Policy
.HandleResult(x=>x.ApplicationVersions[0]?.Status!=ApplicationVersionStatus.Processed)
.WaitAndRetryAsync(10,RetryAtt尝试=>TimeSpan.FromSeconds(1),onRetry:(描述响应,TimeSpan,上下文)=>{
Console.WriteLine($”应用程序版本为“{DescriberResponse.Result.ApplicationVersions[0].Status}”,正在{timeSpan}中重试”);
});
风险值回退=策略
.HandleResult(x=>x.ApplicationVersions[0]?.Status!=ApplicationVersionStatus.Processed)//可能值得将谓词分解到一个方法中,以便只声明一次。
.FallbackAsync(async()=>{throw new ReplacementException();});
var r=await fallback.WrapAsync(重试)
.ExecuteAsync(()=>
BeanstalkClient.DescribeApplicationVersionAsync(describeApplicationVersionRequest)
);

感谢您的回复。在本例中,我没有处理的原始异常。我仅基于对象值重试。对于我来说,处理这个问题最直接的方法可能是将我的API调用封装在一个函数中,如果响应值不是我所需要的,则该函数会引发异常。然后我将免费获得异常重新刷新。是的,您可以将您的响应封装在源代码处的异常中。但是,如果您希望将响应保留为对象值,但让Polly将最终失败的对象结果转换为异常,那么您可以按照我的第三个项目符号:a
FallbackPolicy
执行此操作。在重试之外,您可以包装(使用
PolicyWrap
)处理结果的
FallbackPolicy
,其回退操作是抛出替换异常。这样,您就可以将您所需的总体方法表示为单个策略(PolicyWrap,结合回退和重试)。它可以很容易地转换为其他返回类型,并且是异步的。编辑答案以提供基于最初发布的代码的异步版本。非常感谢您的全面响应和示例,非常感谢。这应该能帮我找到我想要的!谢谢你的回复。在本例中,我没有处理的原始异常。我仅基于对象值重试。也许最简单的方法