javascript web worker 无法直接传递 error 对象,因为跨线程通信依赖结构化克隆算法,该算法不支持自定义类实例。正确的做法是在 worker 内部捕获异常,将错误信息序列化为包含 name、message 和堆栈信息的普通对象,再通过 postmessage 发送回主线程,主线程收到后根据字段还原错误状态。

Worker 端如何序列化并抛出错误
在 Worker 脚本中,必须使用 try...catch 块包裹所有可能出错的逻辑。捕获到异常后,构造一个包含 error.name、error.message 和 error.stack 的纯对象,调用 self.postMessage() 将其发送给主线程。这样做的结果是主线程接收到的不再是 Error 实例,而是一个结构化的数据对象,便于后续处理。

try {
// 模拟异步或同步操作
const result = JSON.parse('invalid json');
} catch (e) {
self.postMessage({
type: 'error',
name: e.name,
message: e.message,
stack: e.stack
});
}
主线程如何接收并还原错误
主线程通过监听 worker.onmessage 事件来接收数据。当消息对象的 type 属性为 'error' 时,说明发生了异常。此时可以读取 data.name 和 data.message 进行日志记录或 UI 提示。如果需要完整的 Error 行为,可以使用 Object.assign(new Error(), data) 重新生成一个 Error 实例,从而保留 stack 等属性。

worker.onmessage = function(e) {
if (e.data.type === 'error') {
const err = new Error(e.data.message);
err.name = e.data.name;
console.error(err);
}
};
Worker 内部未捕获异常会怎样
如果 Worker 内部发生错误且未被 try...catch 捕获,或者在初始化阶段就崩溃,Worker 会自动终止。此时主线程不会收到任何 onmessage 数据,而是触发 worker.onerror 事件。该事件对象包含 message、filename 和 lineno 属性,可用于定位崩溃位置。这种机制确保了即使序列化失败,主线程也能感知到 Worker 的死亡。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











