题目:以下代码有错吗?如果有错,如何更正?
// 问题一:
try {
setTimeout(() => {
throw new Error('err');
}, 2000)
} catch(err) {
console.log(err);
}
// 问题二:
try {
Promise.resolve().then(() => {
throw new Error('err');
})
} catch(err) {
console.log(err);
}
问题一:try...catch不能异步捕获代码错误。在JavaScript中,setTimeout是一个异步函数,它的回调函数会在指定的延时后被放入事件队列,等待当前执行栈清空后才执行。因此,当setTimeout的回调函数执行并抛出错误时,try...catch已经执行完毕,无法捕捉到异步回调中的错误。
new Promise((resolve, reject) => {
setTimeout(() => {
try {
throw new Error('err');
}catch(err) {
reject(err);
}
}, 2000)
}).then(() => {
// 正常执行时的处理逻辑
}).catch(err => {
console.log(err); // 这里会捕捉到错误
})
问题二:try...catch不能捕捉到在Promise链中的异步错误。Promise对象用于表示一个异步操作的最终完成(或失败),及其结果值。一个Promise的状态可能有以下几种:
- Pending(等状态):初始状态,既不是成功,也不是失败状态
- Fulfilled(成功态):意味者操作成功完成
- Rejected(失败态):意味着操作失败
在Promise中抛出一个错误(通过throw语句)会导致Promise被拒绝(或失败)。要正确处理这个错误,需要在Promise链中使用.catch方法或者在一个async函数中使用try...catch。
// 方法一
Promise.resolve().then(() => {
throw new Error('err');
}).catch(err => {
console.log(err); // 这里会捕捉到错误
});
// 方法二
const handleError = async () => {
try {
await Promise.resolve().then(() => {
throw new Error('err');
})
} catch(err) {
console.log(err); // 这里会捕捉到错误
}
}
handleError();