web worker崩溃时主线程默认无通知,需主动设计容错:监听worker的onerror捕获初始化错误;worker内通过onerror/onunhandledrejection上报运行时异常;添加心跳检测防卡死;关键逻辑用try/catch兜底。

Web Worker 线程崩溃时,主线程默认收不到任何通知,也不会触发 onerror 或 onmessageerror(除非是消息序列化失败),因此必须主动设计容错机制。
监听 Worker 的 error 事件
Worker 实例本身支持 onerror 事件,但仅捕获初始化阶段的脚本加载/解析错误(如语法错误、404),不捕获运行时异常(如 throw new Error() 或未捕获的 Promise 拒绝)。
- 在主线程中创建 Worker 后立即绑定:
const worker = new Worker('worker.js');
worker.onerror = (e) => {
console.error('Worker 初始化失败:', e.filename, e.lineno, e.message);
};
注意:该事件不会被 try/catch 捕获,也不能用 addEventListener(规范限制,只能用 onerror 属性)。
在 Worker 内部主动上报运行时异常
Worker 线程中发生的 JS 错误(如未捕获异常、Promise rejection)默认静默,需手动透出到主线程。
- 监听全局
error和unhandledrejection:
// worker.js
self.onerror = (message, filename, lineno, colno, error) => {
self.postMessage({
type: 'WORKER_ERROR',
payload: { message, filename, lineno, colno, stack: error?.stack }
});
return true; // 阻止默认错误报告(可选)
};
<p>self.onunhandledrejection = (e) => {
self.postMessage({
type: 'WORKER_REJECTION',
payload: { reason: e.reason?.toString(), stack: e.reason?.stack }
});
};
</p>主线程通过 onmessage 接收并处理这些自定义错误消息。
添加心跳与超时检测机制
当 Worker 因死循环、卡死或意外退出而无响应时,error 事件也不会触发。需引入主动探测机制。
- Worker 定期发送心跳消息(如每 2 秒);
- 主线程启动定时器,若超过阈值未收到心跳,则判定为“逻辑崩溃”;
- 触发重建 Worker 或降级处理。
// 主线程
let lastHeartbeat = Date.now();
const heartbeatTimeout = 5000;
<p>const worker = new Worker('worker.js');
worker.onmessage = (e) => {
if (e.data.type === 'HEARTBEAT') {
lastHeartbeat = Date.now();
} else {
// 处理正常业务消息
}
};</p><p>const checkAlive = () => {
if (Date.now() - lastHeartbeat > heartbeatTimeout) {
console.warn('Worker 可能已卡死,准备重建');
worker.terminate();
// 创建新 worker...
}
};
setInterval(checkAlive, 1000);
</p>使用 try/catch 包裹关键执行逻辑
在 Worker 中,对可能出错的计算、解析、IO 操作加兜底,避免异常直接终止当前任务流。
- 尤其在
onmessage回调中必须包裹:
// worker.js
self.onmessage = (e) => {
try {
const result = heavyComputation(e.data);
self.postMessage({ type: 'SUCCESS', result });
} catch (err) {
self.postMessage({
type: 'TASK_ERROR',
error: err.message,
stack: err.stack
});
}
};
这样即使单个任务失败,Worker 进程仍存活,可继续接收后续消息。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











