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

使用Policy的TimeoutAsync时无法捕获异常的原因排查

问题分析与解答

你遇到的情况核心和Polly乐观超时的运行机制、VS调试器的默认行为有关,下面拆解说明:

1. Polly乐观超时的执行逻辑

当使用TimeoutStrategy.Optimistic时,Polly的处理流程是:

  • 把你传入的cancellationToken和Polly内部生成的超时Token合并成一个组合Token
  • 超时时间到后,Polly会取消内部的超时Token,进而触发组合Token的取消信号
  • 你代码里的Task.Delay会响应这个取消信号,抛出TaskCanceledException
  • Polly会捕获这个TaskCanceledException,将其包装为TimeoutRejectedException后重新抛出

2. 为什么你的catch块看似没捕获到异常

你看到VS从AsyncTimeoutEngine抛出异常,本质是调试器的“首次机会异常”提示——VS默认会在异常第一次被抛出时就中断,哪怕这个异常后续会被代码捕获(比如Polly内部会接住TaskCanceledException)。

实际运行时(关闭调试器或在调试时点击“继续执行”),最终抛出的TimeoutRejectedException会被你代码里的catch (TimeoutRejectedException)块捕获;如果这个分支没命中,才会进入catch (Exception)。

验证方式

  • 调试时遇到异常弹窗,直接按F5继续执行,就能看到代码进入对应的catch块
  • 也可以在VS的调试→Windows→异常设置里,取消勾选System.Threading.Tasks.TaskCanceledException,这样调试器就不会在这个异常首次抛出时中断了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:40:16