web worker异常需在子线程内主动捕获并上报:同步错误用self.addeventlistener('error')或self.onerror,promise拒绝错误必须监听'unhandledrejection',上报时手动提取error字段序列化,主线程通过onmessage和onerror双通道接收处理。

Web Worker 子线程的异常不会自动冒泡到主线程,也不能被主线程的 window.onerror 或 try...catch 捕获。必须在 Worker 内部主动监听、捕获,并通过 postMessage 主动上报,主线程再接收处理——这是唯一可靠的方式。
Worker 内部必须监听两类错误
Worker 运行在独立全局上下文,self 是其等价于主线程 window 的对象。所有未捕获错误都需显式监听:
-
同步错误(如 ReferenceError、SyntaxError、importScripts 失败):用
self.addEventListener('error', handler)—— 推荐写法,语义清晰,支持e.preventDefault()阻止控制台默认输出 -
或使用兼容写法:
self.onerror = (message, filename, lineno, colno, error) => { ... },接收标准五参数,适合老旧环境 -
Promise 拒绝(静默错误):未
.catch()的Promise.reject()不会触发onerror,必须额外监听self.addEventListener('unhandledrejection', e => { ... })
上报错误时注意序列化限制
postMessage 使用结构化克隆算法,不能直接传 Error 实例(会丢失 stack、name 等关键属性):
- 手动提取字段:
{ type: 'error', name: error.name, message: error.message, stack: error.stack, timestamp: Date.now() } -
error.stack在 Chrome/Firefox 中可读取,建议先JSON.stringify(error.stack)验证是否可序列化 - 避免传递函数、
undefined、循环引用对象
主线程要分层接收和处理
主线程无法被动感知 Worker 错误,必须同时监听两个通道:
-
worker.onmessage:解析event.data.type === 'error'的消息,提取 payload 做日志、告警或降级 -
worker.onerror:仅捕获 Worker 初始化阶段的底层失败,比如脚本 404、CORS、语法错误导致创建失败(这类错误无法在 Worker 内监听) - 建议统一错误格式,例如
{ type: 'worker-error', payload: { name, message, stack, timestamp } },便于与业务消息区分
别漏掉 Promise 链中的异步拒绝
Worker 内的 async/await 或 Promise.then() 抛出的错误,如果没加 .catch() 或 try...catch,就会变成 unhandled rejection:
- 必须注册
self.addEventListener('unhandledrejection', e => { self.postMessage({ type: 'worker-unhandled-rejection', reason: e.reason }); }) - 该事件默认不启用,漏掉即等于放弃捕获整个异步错误链
- 对
e.reason同样要做字段提取和序列化,不能直接传e.reason对象
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











