在JavaScript开发中,错误是不可避免的,合理的错误处理机制能让程序在出现异常时依然保持可控状态。try...catch和Promise错误捕获是两种最常用的错误处理方式,它们分别适配不同的代码场景,理解两者的特性和差异是提升代码健壮性的关键。

try...catch的基础用法
try...catch是JavaScript原生的同步错误处理语法,主要用于捕获同步代码中抛出的异常。当try代码块中的代码执行出错时,会立即跳转到catch代码块执行错误处理逻辑,不会中断整个程序的运行。
基本语法结构如下:
try {
// 可能会抛出错误的同步代码
let result = 10 / 0;
if (!isFinite(result)) {
throw new Error("计算结果不是有限数");
}
console.log(result);
} catch (error) {
// 捕获错误后的处理逻辑
console.log("捕获到错误:" + error.message);
} finally {
// 无论是否出错都会执行的代码,可选
console.log("错误处理流程结束");
}
需要注意的是,try...catch只能捕获同步代码中的错误,对于异步代码(比如定时器、异步请求)中抛出的错误,try...catch是无法捕获的。例如下面的代码,错误不会被catch块捕获:
try {
setTimeout(() => {
throw new Error("异步代码中的错误");
}, 1000);
} catch (error) {
console.log("不会执行到这里");
}
Promise的错误捕获方式
Promise是处理异步操作的核心对象,它提供了多种错误捕获方式,专门用来处理异步流程中出现的异常。Promise的错误捕获主要有两种常用方式:
1. then方法的第二个参数
Promise的then方法可以接收两个回调函数,第一个处理成功状态,第二个处理失败状态,当Promise的状态变为rejected时,会执行第二个回调函数。
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error("异步操作失败"));
}, 1000);
});
promise.then(
(result) => {
console.log("成功结果:" + result);
},
(error) => {
console.log("捕获到Promise错误:" + error.message);
}
);
2. catch方法
catch方法是then方法第二个参数的语法糖,专门用于捕获Promise链中的错误,它不仅能捕获Promise本身的rejected状态,还能捕获then方法中处理成功回调时抛出的错误,可读性也更强,是更推荐的使用方式。
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("初始结果");
}, 1000);
});
promise
.then((result) => {
console.log(result);
throw new Error("then处理中抛出的错误");
})
.catch((error) => {
console.log("捕获到链中的错误:" + error.message);
});
try...catch与Promise错误捕获的差异对比
两者的核心差异主要体现在适用场景、捕获范围和使用方式上,具体对比如下:
| 对比维度 | try...catch | Promise错误捕获 |
|---|---|---|
| 适用代码类型 | 同步代码 | 异步代码(Promise封装的异步操作) |
| 捕获范围 | 仅能捕获try块内的同步错误 | 能捕获Promise链中所有rejected状态和回调中抛出的错误 |
| 语法结构 | 原生语法块,不需要依赖Promise对象 | 依赖Promise实例的then或catch方法 |
| 异步错误支持 | 不支持 | 原生支持 |
结合使用的实践方案
在实际开发中,我们经常会遇到同步和异步代码混合的场景,这时候可以结合使用两种错误处理方式,让错误覆盖更全面。
比如在使用async/await语法时,await后面的Promise错误可以用try...catch捕获,这是两者结合的典型场景:
async function fetchData() {
try {
// await会等待Promise完成,如果Promise reject,错误会被catch捕获
let response = await fetch("https://ipipp.com/api/data");
let data = await response.json();
console.log(data);
} catch (error) {
console.log("请求或处理数据出错:" + error.message);
}
}
fetchData();
上面的代码中,fetch返回的Promise如果失败,或者json解析过程出错,都会被外层的try...catch捕获,这种方式让异步代码的错误处理写起来和同步代码一样直观。
常见注意事项
- 不要在Promise的catch方法后再添加then方法处理成功逻辑,除非你确定错误已经被处理不会影响后续流程,否则容易造成逻辑混乱。
- try...catch中的throw可以抛出任意类型的值,不一定是Error实例,但是建议统一抛出Error实例,方便统一处理错误信息。
- 未捕获的Promise错误会触发全局的unhandledrejection事件,可以在全局监听这个事件来处理遗漏的Promise错误,避免程序静默失败。
错误处理的核心目标是让程序在出现异常时依然能给出明确的反馈,或者执行降级逻辑,而不是直接崩溃。根据代码的同步异步特性选择合适的错误处理方式,才能写出更健壮的JavaScript代码。
JavaScript错误处理try_catchPromise错误捕获修改时间:2026-07-07 19:24:14