必须用try-catch Throwable强兜底整个run()逻辑,区分异常类型做响应式处理,绑定线程身份与上下文快照,并通过实操检查点验证兜底有效性。

在复杂动态路由场景中,原生线程(即直接 new Thread() 启动的平台线程)一旦抛出未捕获异常,会立即终止且不通知调用方——这就是“静默消亡”。它不会中断主线程,也不会触发任何回调,只会打印堆栈到 stderr 后悄然退出。要确保线程绝不静默消亡,核心不是靠外部拦截,而是在线程执行体内部用 try-catch 做**强兜底**,并配合状态标记与日志可追溯性。
必须包裹整个 run() 主逻辑
动态路由任务常含多层嵌套调用(如路由匹配→参数解析→插件加载→执行器分发),异常可能发生在任意深度。若只在最外层 catch RuntimeException,会漏掉 Error(如 OutOfMemoryError)或被 Thread.stop() 等中断机制绕过。
- 将全部业务代码(包括 while 循环、阻塞读取、第三方 SDK 调用)严格包裹在一个顶层 try-catch 中
- catch 块至少覆盖 Throwable(不只是 Exception),否则 StackOverflowError、NoClassDefFoundError 等仍会导致线程退出
- 避免在 catch 中仅记录日志就 return;必须确保 finally 或后续逻辑能维持线程存活(如重置状态、触发下一轮)
区分异常类型,做有响应的兜底
不是所有异常都该“吞掉”。静默消亡的反面不是静默忽略,而是“有感知、有动作、可追踪”:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 瞬时可恢复异常(如 ConnectException、TimeoutException、429 Too Many Requests):记录 warn 日志 + 设置退避延迟 + 继续循环
- 数据/协议类异常(如 JSON parse error、路由规则校验失败):标记当前路由上下文为“临时失效”,跳过本次执行但保持线程活跃
- 致命不可恢复异常(如 ClassCastException 在关键转换处、NPE 在初始化路径):记录 error 日志 + 触发告警 + 主动调用 Thread.currentThread().interrupt() 标记,但不退出线程(留待监控系统发现后人工介入)
绑定线程身份与上下文快照
动态路由线程往往复用率高、生命周期长,单靠日志堆栈难以定位是哪条路由链路触发了异常。需主动注入可识别线索:
- 在线程启动时设置唯一名称:
thread.setName("route-dynamic-" + routeId + "-" + UUID.randomUUID()) - 在 try 块入口处保存当前路由配置快照(如 path pattern、predicate 条件、插件列表),异常时一并打印
- 使用 MDC(如 Logback 的 MappedDiagnosticContext)注入 traceId、routeId、stage,确保异常日志自动携带上下文
验证兜底是否生效的实操检查点
光写 try-catch 不代表兜底成功。上线前必须验证:
- 手动在路由执行最深层 throw new RuntimeException("test-crash"),观察线程是否仍在 jstack 中存活、日志是否完整输出上下文
- 检查线程计数指标(如 JMX 的 ThreadCount)在异常爆发期是否稳定,而非阶梯式下降
- 确认异常日志中包含 thread.getName()、MDC 字段、原始堆栈(非 ExecutionException 包装层)
- 禁用所有全局 UncaughtExceptionHandler,纯靠内部 try-catch 验证——避免误以为是外部机制起效


















