NodeTimeoutError)时,重试策略决定是否重试。只有在重试耗尽后,错误处理器才会运行。
如需在超步边界处干净地停止运行并稍后恢复,请参阅优雅关闭。
每节点超时和节点级错误处理器需要
langgraph>=1.2。重试
重试策略根据异常类型和退避设置自动重新运行失败的节点尝试。将retry_policy= 传递给 add_node:
默认行为
默认情况下,retry_on 使用 default_retry_on,它会对任何异常进行重试,但以下异常(及其子类)除外:
ValueErrorTypeErrorArithmeticErrorImportErrorLookupErrorNameErrorSyntaxErrorRuntimeErrorReferenceErrorStopIterationStopAsyncIterationOSError
requests 和 httpx)的异常,它仅对 5xx 状态码进行重试。NodeTimeoutError 默认可重试。
参数
自定义重试逻辑
将可调用对象或异常类型传递给retry_on。导入 default_retry_on 以扩展默认行为:
检查重试状态
在节点内使用runtime.execution_info 来检查当前尝试次数。这在主调用持续失败时切换到备用方案很有用:
execution_info 暴露以下字段:
即使没有重试策略,
execution_info 也可用——node_attempt 默认为 1。
超时
需要
langgraph>=1.2。add_node 上的 timeout= 参数限制单个节点尝试可以运行的时间。传入数字(秒)、timedelta 或 TimeoutPolicy 以设置单独的运行和空闲限制:
运行超时
run_timeout 是单次尝试的硬性墙钟时间上限。它永远不会被刷新,无论节点活动如何:
NodeTimeoutError,清除失败尝试的所有写入,并让重试策略决定是否重试。
空闲超时
idle_timeout 是一个进度重置上限。它仅在节点在指定时间内停止产生可观察进度时触发——与 run_timeout 不同,当节点产生进度信号时时钟会重置:
run_timeout 和 idle_timeout。先触发的那个会取消尝试。
进度信号
在默认的refresh_on="auto" 下,空闲时钟在以下任何情况下重置:
- 通过
CONFIG_KEY_SEND进行状态写入 - 流输出(生成的异步流数据块)
- 子任务调度
- 运行时流写入器调用
- 来自节点或其后代的任何 LangChain 回调事件(LLM Token、工具调用、链开始/结束等)
心跳模式
设置refresh_on="heartbeat" 将刷新源缩小到仅显式的 runtime.heartbeat() 调用。当你想要一个不被繁杂的子任务重置的严格空闲定义时,这很有用:
手动心跳
对于不自然产生进度信号的长时间运行的异步工作,调用runtime.heartbeat() 手动重置空闲时钟:
runtime.heartbeat() 在非空闲超时尝试之外是空操作,所以你可以无条件调用它。
NodeTimeoutError
当超时触发时,LangGraph 抛出NodeTimeoutError,其中包含关于触发了哪个限制的结构化上下文:
NodeTimeoutError 默认可重试。将 timeout= 与 retry_policy= 组合使用开箱即用——超时时钟在每次新尝试时重置,超时尝试的写入在下次重试前被清除:
使用 Send 的动态超时
当使用Send 动态分发节点时(例如在 map-reduce 模式中),你可以直接在 Send 上传递 timeout=,为该特定推送覆盖目标节点的静态超时:
Send 上省略了 timeout=,则应用目标节点的超时(在 add_node 时设置)。这让你可以在节点上设置默认超时并为单个调用收紧它。
错误处理
需要
langgraph>=1.2。Command 路由到不同的节点。这对于补偿流程(Saga 模式)很有用,你希望优雅地恢复而不是中止整个图。
将 error_handler= 传递给 add_node:
retry_policy 耗尽后触发,或在未配置重试策略时立即触发。重试策略和错误处理器保持解耦:独立配置何时重试和何时补偿。
NodeError
错误处理器通过类型化的error: NodeError 参数接收失败上下文,通过类型注解注入(与 runtime: Runtime 相同的模式):
NodeError 是一个冻结的数据类,有两个字段:
error: NodeError 参数是可选的。不需要失败上下文的处理器可以使用更简单的签名,如 (state) 或 (state, runtime)。
使用 Command 路由
错误处理器可以返回Command 来更新状态并路由到特定节点,实现 Saga / 补偿模式:
charge_payment 对 ConnectionError 最多重试 3 次。如果重试耗尽(或错误不是 ConnectionError),处理器通过更新状态并路由到 finalize 来进行补偿,而不是中止图。
恢复安全的故障
故障来源会被检查点记录。如果图在节点失败后但在处理器完成之前被中断或进程崩溃,当图从检查点恢复时,处理器会看到相同的
NodeError 上下文。与 interrupt() 的行为
子图故障
如果一个节点包装了子图且子图抛出了未处理的异常,该异常会传递到父节点。如果父节点有error_handler,处理器将以子图的异常作为 error.error 触发。
Functional API
相同的timeout= 和 retry_policy= 参数在 Functional API 的 @task 和 @entrypoint 上可用:
add_node 相同:超时时抛出 NodeTimeoutError,缓冲的写入被清除,重试策略决定是否重试。
限制
- 仅 Python:超时和错误处理器在 JavaScript/TypeScript SDK 中不可用。重试策略在 Python 和 TypeScript 中都可用。
- 超时仅限异步:带有
timeout的同步节点在编译时会被拒绝。 - 每个节点一个处理器:每个节点最多可以有一个
error_handler。 - 处理器失败向上冒泡:如果错误处理器本身抛出异常,该异常会像节点没有处理器一样传播。
将这些文档连接到 Claude、VSCode 等工具,通过 MCP 获取实时答案。

