You need to enable JavaScript to run this app. Polly异步重试下Console.WriteLine未生效 需3次重试后输出报错提示
优惠活动
大模型
产品
解决方案
定价
更多

Polly异步重试下Console.WriteLine未生效 需3次重试后输出报错提示

代码无法达成目标的核心缺陷
  • Polly策略的异常捕获范围不匹配实际异常类型
    当前策略仅声明捕获HttpRequestException、TaskCanceledException两类异常,但PersistApplicationData2中整数除以0的逻辑会抛出DivideByZeroException,完全不在策略的捕获列表内。首次执行失败后策略不会触发任何重试,直接向外抛出异常,从逻辑上就不可能完成3次执行尝试的要求。
  • 异步执行链没有等待导致进程提前终止
    Main方法作为程序同步入口,代码中ExecuteAsync、ContinueWith返回的Task对象没有做任何阻塞等待,Main方法走完所有同步逻辑后会直接退出进程,既等不到重试流程跑完,也等不到后续的"show error"输出逻辑执行。
  • 重试次数参数的语义和目标要求不一致
    Polly的WaitAndRetryAsync第一个入参的含义是「初始尝试失败后的重试次数」,传入值3的话总执行次数是1次初始尝试 + 3次重试 = 4次,和目标要求的“累计3次执行尝试”不匹配。如果要实现总共3次尝试,需要给该参数传入2。
  • 异常判断逻辑存在疏漏
    代码中用ContinueWith判断异常时,没有指定TaskContinuationOptions.OnlyOnFaulted,且异步任务抛出的异常会被包装在AggregateException中,在进程提前退出的场景下,这类未被观察的异常很可能直接导致程序崩溃,而不是正常输出提示信息。

修正后的核心逻辑参考:

static void Main(string[] args)
{
    var maxTotalAttempts = 3;
    var pauseBetweenFailures = TimeSpan.FromSeconds(2);

    var retryPolicy = Policy
        .Handle<HttpRequestException>()
        .Or<TaskCanceledException>()
        .Or<DivideByZeroException>() // 补充实际抛出的异常类型
        // 总尝试3次=重试2次
        .WaitAndRetryAsync(maxTotalAttempts - 1, i => pauseBetweenFailures);

    try
    {
        // 同步阻塞等待异步流程执行完成
        retryPolicy.ExecuteAsync(PersistApplicationData2).GetAwaiter().GetResult();
    }
    catch (Exception)
    {
        Console.WriteLine("show error");
    }
}

内容的提问来源于stack exchange,提问作者HelloWorld1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 00:15:04