worker线程内异常必须主动捕获处理并上报,否则将静默失败或导致线程退出;需在任务入口用try-catch封装,结构化上报错误至主线程,并配合重试、降级与监听机制保障系统可用性。

Worker 线程内的异常不会自动传播到主线程,必须主动捕获、处理并上报,否则可能静默失败或导致线程意外退出。
线程内必须用 try-catch 封装任务逻辑
Worker 执行的代码运行在独立上下文中,未捕获的异常会终止当前 Worker 实例,且不触发主线程的 onerror。因此,所有关键执行路径都应包裹在 try-catch 中:
- 在 Web Workers 中,
self.onmessage回调里必须加 try-catch,避免单个消息处理失败导致整个 Worker 挂掉 - 在 C++ workerpool 或 workspace 框架中,工作函数入口处需手动添加
try { ... } catch(...) { ... }块(如 workbranch.hpp 的标准模式) - Go worker 使用
defer + recover()捕获 panic,这是 Go 生态的标准做法
错误需结构化上报,而非仅 console.error
单纯打印日志无法支持远程监控和故障归因。应将错误转为统一格式后发送出去:
- Web Workers 可通过
self.postMessage({ type: 'ERROR', error: { message, stack, timestamp } })主动通知主线程 - Node.js workerpool 自动序列化错误对象(含
message、stack、code),确保主线程能还原关键信息 - Graphile Worker 和 goworker 将错误存入数据库,附带
failed_at、backtrace、queue等字段,便于后续分析
主线程要监听并响应 Worker 异常事件
主线程不能只依赖 Worker 主动上报,还需建立兜底监听机制:
- 绑定
worker.onerror处理 Worker 初始化失败或脚本解析错误(这类错误无法被 Worker 内部 catch) - 配合心跳机制:Worker 定期 postMessage 心跳,主线程超时未收到即标记为“失联”,触发重启或转移任务
- 对返回的 ERROR 消息做分类响应——临时性错误(如网络抖动)触发重试;结构性错误(如 schema 不匹配)则告警并暂停同类任务
结合重试与降级,避免单点崩溃扩散
异常管理的终点不是记录,而是恢复。需配套执行策略:
- 对可重试任务(如 HTTP 请求、DB 查询),在 Worker 内实现指数退避重试,失败后再上报
- 当某个 Worker 频繁报错,Manager 应将其临时下线,把新任务路由给健康实例(HiClaw Manager 的典型做法)
- 关键路径上预置降级逻辑,例如 Worker 计算失败时,主线程可切换为轻量 JS 计算或返回缓存结果










