Web Worker 错误必须在内部监听并 postMessage 上报。同步错误监听 self.onerror 或 error 事件,Promise 拒绝需监听 unhandledrejection,上报时手动提取 Error 字段确保可序列化,主线程通过 onmessage 和 onerror 双通道接收。

Web Worker 中的错误不会自动传到主线程,也不能用主线程的 try/catch 或 window.onerror 捕获。必须在 Worker 内部主动监听、捕获,并通过 postMessage 上报——这是唯一可靠的方式。
同步错误要监听 self.onerror 或 error 事件
ReferenceError、SyntaxError、importScripts 失败等同步异常,需在 Worker 内显式监听:
- 推荐写法:
self.addEventListener('error', e => { e.preventDefault(); self.postMessage({ type: 'error', ... }); }),语义清晰且支持阻止控制台默认输出 - 兼容写法:
self.onerror = (message, filename, lineno, colno, error) => { self.postMessage({ type: 'error', name: error?.name, message: error?.message, stack: error?.stack }); },适合老旧环境,接收标准五参数
Promise 拒绝错误必须单独监听 unhandledrejection
未 .catch() 的 Promise.reject() 或 async/await 抛出的异常,不会触发 onerror,必须额外处理:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
self.addEventListener('unhandledrejection', e => { self.postMessage({ type: 'unhandled-rejection', reason: e.reason }); })- 注意:如果
e.reason是 Error 实例,需手动提取字段再序列化,否则会丢失stack等关键信息
上报时注意结构化与可序列化
postMessage 使用结构化克隆算法,不能直接传 Error 对象:
- 手动提取字段,例如:
{ type: 'worker-error', name: err.name, message: err.message, stack: err.stack, timestamp: Date.now() } - 先用
JSON.stringify(err.stack)验证是否可序列化(Chrome/Firefox 中通常可用) - 避免传递函数、
undefined、循环引用对象或 DOM 节点
主线程要双通道接收并区分错误类型
主线程无法被动感知 Worker 运行时错误,必须同时监听两个入口:
-
worker.onmessage:接收 Worker 主动上报的业务错误(如type === 'error'),用于日志、告警或 UI 提示 -
worker.onerror:仅捕获 Worker 初始化阶段失败(脚本 404、CORS、语法错误等),这类错误 Worker 内部无法监听 - 建议统一错误格式,例如
{ type: 'worker-error', payload: { ... } },便于和普通业务消息区分

















