使用 try - catch 捕获错误
async function tryCatchExample() {
try {
const result1 = await new Promise((resolve) => {
setTimeout(() => {
resolve('第一个Promise成功');
}, 1000);
});
console.log(result1);
const result2 = await new Promise((_, reject) => {
setTimeout(() => {
reject('第二个Promise抛出错误');
}, 1000);
});
console.log(result2);
const result3 = await new Promise((resolve) => {
setTimeout(() => {
resolve('第三个Promise成功');
}, 1000);
});
console.log(result3);
const result4 = await new Promise((resolve) => {
setTimeout(() => {
resolve('第四个Promise成功');
}, 1000);
});
console.log(result4);
} catch (error) {
console.error('try - catch捕获到错误:', error);
}
}
tryCatchExample();
使用 Promise 的 catch 方法捕获错误
function promiseCatchExample() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('第一个Promise成功');
}, 1000);
})
.then(result1 => {
console.log(result1);
return new Promise((_, reject) => {
setTimeout(() => {
reject('第二个Promise抛出错误');
}, 1000);
});
})
.then(result2 => {
console.log(result2);
return new Promise((resolve) => {
setTimeout(() => {
resolve('第三个Promise成功');
}, 1000);
});
})
.then(result3 => {
console.log(result3);
return new Promise((resolve) => {
setTimeout(() => {
resolve('第四个Promise成功');
}, 1000);
});
})
.catch(error => {
console.error('Promise的catch方法捕获到错误:', error);
});
}
promiseCatchExample();
两种方式处理错误的不同点
- 语法结构:
- try - catch:是同步代码块的错误捕获机制,使用
try
包裹可能抛出错误的代码,catch
捕获并处理错误,常用于async/await
函数中,因为await
会暂停函数执行直到Promise被解决。
- Promise的catch:是Promise链式调用中的一部分,通过
.catch
方法来捕获Promise链中任何一个被拒绝的Promise,它是异步操作的错误处理方式,适用于链式调用的场景。
- 错误捕获范围:
- try - catch:只能捕获
try
块内同步代码和通过await
暂停的Promise中抛出的错误。如果await
后的Promise没有被暂停(例如在另一个异步函数中),try - catch
无法捕获其错误。
- Promise的catch:能捕获整个Promise链中任何一个被拒绝的Promise的错误,无论该Promise是在链式调用的何处被拒绝,只要后续有
.catch
方法,就能捕获到错误。
- 代码风格:
- try - catch:使代码看起来更像传统的同步代码错误处理方式,在处理
async/await
时更符合常规的错误处理习惯,代码结构相对清晰,尤其在多个await
语句顺序执行的情况下。
- Promise的catch:更适合Promise链式调用的场景,使代码保持链式调用的风格,在处理多个异步操作依次执行并处理错误时,代码结构简洁明了,不需要额外的
async/await
语法。