在JavaScript的运行过程中,语法错误、运行时错误或者逻辑异常都可能导致程序中断执行,掌握合适的异常捕获和错误处理方法是前端开发者的必备技能,能够有效提升应用的稳定性。
基础异常捕获:try catch语句
try catch是JavaScript中最基础的异常捕获结构,用来捕获代码块中运行时抛出的异常,基本语法如下:
try {
// 可能会抛出异常的代码
const result = undefinedVariable + 1;
} catch (error) {
// 捕获到异常后的处理逻辑
console.log('捕获到错误:', error.message);
} finally {
// 无论是否抛出异常都会执行的代码,可选
console.log('try catch执行结束');
}
在try代码块中如果发生了异常,程序会立刻跳转到catch代码块,catch的参数error是抛出的异常对象,包含错误的相关信息。finally代码块中的内容无论是否有异常都会执行,通常用来做资源清理之类的操作。
catch中的错误对象属性
catch接收到的错误对象通常包含以下常用属性:
- message:错误的描述信息
- name:错误的类型名称,比如ReferenceError、TypeError等
- stack:错误的堆栈追踪信息,方便排查问题发生的位置
主动抛出异常:throw语句
除了捕获运行时自动抛出的异常,我们还可以使用throw语句主动抛出自定义异常,用来处理不符合业务逻辑的情况:
function divide(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
// 主动抛出类型错误异常
throw new TypeError('参数必须是数字类型');
}
if (b === 0) {
// 主动抛出范围错误异常
throw new RangeError('除数不能为0');
}
return a / b;
}
try {
divide(10, 0);
} catch (error) {
console.log(error.name, error.message);
}
throw可以抛出任意类型的值,包括字符串、数字、对象等,不过最佳实践是通过内置的错误构造函数(TypeError、RangeError、Error等)创建错误对象再抛出,这样能保留更完整的错误信息。
异步代码的异常捕获
传统的try catch无法直接捕获异步回调中的异常,针对不同的异步场景需要使用不同的捕获方式。
Promise的错误捕获
Promise实例可以通过catch方法来捕获异步操作中抛出的错误:
function fetchData() {
return new Promise((resolve, reject) => {
// 模拟异步请求失败
setTimeout(() => {
reject(new Error('请求数据失败'));
}, 1000);
});
}
fetchData()
.then(data => {
console.log('获取数据成功', data);
})
.catch(error => {
console.log('Promise捕获到错误:', error.message);
});
如果Promise内部抛出错误或者调用了reject,都会被后面的catch方法捕获到。另外,在then方法的回调中抛出的错误同样会被catch捕获。
async/await的异常捕获
使用async/await语法时,可以用try catch来捕获异步操作的错误,这种方式写起来更接近同步代码的逻辑:
async function getData() {
try {
const result = await fetchData();
console.log('数据结果', result);
} catch (error) {
console.log('async/await捕获到错误:', error.message);
}
}
getData();
全局错误监听
对于没有被捕获的异常,我们可以通过全局监听来捕获,避免异常直接导致页面崩溃,同时可以上报错误信息方便排查问题。
监听同步和异步未捕获错误
window对象提供了error事件,可以监听未被捕获的错误:
window.addEventListener('error', function(event) {
// event.message 错误信息
// event.filename 发生错误的文件
// event.lineno 发生错误的行号
// event.colno 发生错误的列号
// event.error 错误对象
console.log('全局捕获到未处理错误:', event.message);
// 这里可以上报错误信息到服务端
return true; // 阻止默认的错误提示
});
监听Promise未捕获的拒绝
对于没有被catch的Promise rejection,可以通过unhandledrejection事件来捕获:
window.addEventListener('unhandledrejection', function(event) {
// event.reason 拒绝的原因,也就是reject传递的值或者抛出的错误
console.log('全局捕获到未处理的Promise拒绝:', event.reason);
event.preventDefault(); // 阻止默认的控制台错误提示
});
错误处理最佳实践
- 不要滥用try catch,只在可能出现异常的代码块使用,避免包裹过多无关代码影响性能
- 捕获异常后要根据场景处理,不要空catch,至少打印错误日志或者上报错误
- 主动抛出的异常要选择合适的错误类型,方便后续区分处理
- 全局错误监听用来兜底,不要依赖全局监听处理所有错误,该用try catch捕获的地方还是要捕获
- 生产环境可以对错误信息进行脱敏处理,避免泄露敏感信息
注意:语法错误在代码解析阶段就会被发现,无法通过try catch捕获,所以开发阶段要保证代码语法正确。
JavaScript异常捕获try_catch错误处理throw修改时间:2026-06-16 17:34:04