JavaScript作为前端开发的核心语言,运行时出现的错误如果未被及时捕获,可能会导致页面功能失效甚至白屏,因此掌握错误监控与异常捕获的方法是每个前端开发者的必备技能。不同的错误场景需要适配不同的捕获方案,才能做到全面覆盖。

全局异常捕获方法
全局异常捕获可以覆盖大部分未被局部处理的同步错误,最常用的方式是监听window.onerror事件,该事件会在页面发生未被捕获的运行时错误时触发。
// 全局同步错误捕获
window.onerror = function(message, source, lineno, colno, error) {
// message:错误信息
// source:发生错误的脚本URL
// lineno:错误发生的行号
// colno:错误发生的列号
// error:错误对象,包含堆栈信息
const errorInfo = {
type: 'global_sync_error',
message: message,
source: source,
line: lineno,
column: colno,
stack: error ? error.stack : ''
};
// 这里可以调用上报接口将错误信息发送到服务端
console.log('捕获到全局同步错误:', errorInfo);
// 返回true可以阻止浏览器默认的错误提示
return true;
};
需要注意的是,window.onerror无法捕获跨域脚本的错误,如果引入了跨域的JS文件,需要在脚本标签上添加crossorigin属性,同时服务端需要配置对应的跨域响应头,才能获取到完整的错误信息。
Promise异常捕获方法
Promise是JavaScript中处理异步操作的常用方式,未处理的Promise拒绝(rejection)不会被window.onerror捕获,需要使用专门的监听方式。
可以通过监听unhandledrejection事件来捕获未被处理的Promise异常:
// 未处理的Promise异常捕获
window.addEventListener('unhandledrejection', function(event) {
const errorInfo = {
type: 'promise_rejection',
// event.reason是Promise拒绝的原因,可能是错误对象或者普通值
message: event.reason instanceof Error ? event.reason.message : String(event.reason),
stack: event.reason instanceof Error ? event.reason.stack : ''
};
console.log('捕获到未处理的Promise异常:', errorInfo);
// 阻止浏览器默认的控制台错误提示
event.preventDefault();
});
如果项目中使用了async/await语法,async函数内部抛出的错误如果没有被await捕获,也会作为未处理的Promise拒绝触发该事件,因此这个监听可以覆盖async/await相关的未捕获错误。
局部代码块异常捕获
对于特定的代码逻辑,我们可以使用try...catch语句进行局部异常捕获,这种方式可以精准处理特定代码段的错误,不会影响其他代码的执行。
function handleUserData() {
try {
// 可能出错的代码逻辑
const userData = JSON.parse(localStorage.getItem('user_info'));
if (!userData || !userData.userId) {
throw new Error('用户数据格式异常');
}
return userData;
} catch (error) {
// 捕获到错误后的处理逻辑
console.log('处理用户数据时发生错误:', error.message);
// 可以返回默认值或者执行降级逻辑
return { userId: '', userName: '未知用户' };
}
}
try...catch只能捕获同步错误,无法捕获异步代码中的错误,比如setTimeout内部的错误就无法被外层的try...catch捕获,这类异步错误需要结合全局捕获或者Promise捕获来处理。
资源加载异常捕获
页面中加载的JS、CSS、图片等资源如果加载失败,也会引发问题,这类错误可以通过监听error事件来捕获,需要注意和全局错误捕获的区分。
// 资源加载异常捕获
window.addEventListener('error', function(event) {
// 判断是否是资源加载错误,资源错误的target是元素节点
if (event.target && (event.target.src || event.target.href)) {
const errorInfo = {
type: 'resource_load_error',
resourceUrl: event.target.src || event.target.href,
resourceType: event.target.tagName.toLowerCase()
};
console.log('捕获到资源加载错误:', errorInfo);
}
}, true); // 使用捕获阶段监听,确保能拿到资源加载错误
错误上报与调试技巧
捕获到错误之后,需要将错误信息上报到服务端进行存储和分析,上报时建议包含错误类型、错误信息、发生时间、页面URL、用户标识等信息,方便后续排查问题。
在javascript调试过程中,除了捕获错误,还可以使用console系列方法输出调试信息,比如console.error输出错误信息,console.trace输出调用堆栈,结合浏览器的开发者工具可以快速定位错误位置。
另外,对于线上环境,建议对上报的错误信息进行采样,避免大量重复错误占用过多带宽,同时可以对错误进行聚合,相同类型的错误只上报一次,提升监控效率。
| 捕获方式 | 适用场景 | 局限性 |
|---|---|---|
| window.onerror | 全局同步未捕获错误 | 无法捕获跨域脚本错误、Promise错误、资源加载错误 |
| unhandledrejection | 未处理的Promise拒绝错误 | 只能捕获未被处理的Promise异常 |
| try...catch | 局部同步代码错误 | 无法捕获异步错误、全局错误 |
| 资源加载error监听 | JS、CSS、图片等资源加载失败 | 仅针对资源加载场景 |
JavaScript错误监控异常捕获javascript调试修改时间:2026-07-04 01:39:33