web worker 异常需分层捕获:主线程监听 worker.onerror,worker 内用 self.onerror 和 self.onunhandledrejection 兜底,并通过 postmessage 主动上报结构化错误。

Web Worker 中无法直接通过全局 window.onerror 捕获异常,因为 Worker 运行在独立的上下文里,没有 window 对象。但可以通过监听 Worker 实例的 onerror 事件,在主线程中统一处理 Worker 抛出的未捕获错误。
主线程:监听 Worker 实例的 onerror
创建 Worker 后,给其 onerror 属性赋值一个处理函数,就能捕获 Worker 内部未被 try/catch 拦截的运行时错误(如引用错误、语法错误、未捕获的 Promise 拒绝等)。
- 该事件对象包含
message、filename、lineno、colno等字段,可用于定位问题 - 注意:它不会触发
worker.onerror如果你在 Worker 内部已用self.onerror拦截并return true - 示例:
const worker = new Worker('worker.js');
worker.onerror = function(e) {
console.error('[Worker Error]', {
message: e.message,
filename: e.filename,
lineno: e.lineno,
colno: e.colno,
error: e.error // 可能为 null,取决于浏览器支持
});
// 上报错误、降级处理等
};
// 启动任务
worker.postMessage({ action: 'start' });
Worker 线程内:用 self.onerror 做兜底(可选)
在 worker.js 中,可以设置 self.onerror 来提前拦截错误,避免错误冒泡到主线程的 worker.onerror。适合做日志、清理或主动上报。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 返回
true表示已处理,阻止默认行为(即不触发主线程的onerror) - 返回
false或不返回,则错误继续向上抛出 - 示例:
// worker.js
self.onerror = function(message, filename, lineno, colno, error) {
console.warn('Worker internal error:', message);
// 自定义上报逻辑(如发送到监控服务)
// return true; // 若取消注释,主线程 worker.onerror 将不会触发
};
捕获 Promise 拒绝(重要补充)
Worker 中未被 catch() 的 Promise 拒绝不会触发 self.onerror 或主线程 worker.onerror,需单独监听 self.onunhandledrejection。
- 这是现代 Worker 错误监控的常见遗漏点
- 务必在 Worker 内注册:
// worker.js
self.onunhandledrejection = function(e) {
console.error('Unhandled rejection in worker:', e.reason);
// 主动 postMessage 给主线程,或自行上报
self.postMessage({
type: 'error',
payload: {
type: 'unhandledrejection',
reason: e.reason?.toString() || 'unknown'
}
});
};
增强健壮性:配合 postMessage 主动上报
对于业务逻辑中可预知的异常(如 API 请求失败、数据校验不通过),推荐在 Worker 内用 postMessage 主动发送结构化错误信息,由主线程统一处理。
- 比依赖错误冒泡更可控、语义更清晰
- 便于分类统计、用户提示、自动重试等策略
- 示例消息格式:
// worker.js
try {
const result = riskyOperation();
} catch (err) {
self.postMessage({
type: 'error',
code: 'OPERATION_FAILED',
message: err.message,
timestamp: Date.now()
});
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










