try {
setTimeout(() => {
throw new Error('err')
}, 200);
} catch (err) {
console.log(err);
}
try {
Promise.resolve().then(() => {
throw new Error('err')
})
} catch (err) {
console.log(err);
}
在 JavaScript 中,setTimeout
和 Promise.resolve().then
中的异步操作是在主线程的事件循环之外执行的,因此 try...catch
语句无法捕获到这些异步操作中抛出的异常。
所以,虽然你在 setTimeout
和 Promise.resolve().then
中使用了 throw new Error('err')
,但是它们实际上不会被相应的 catch
语句捕获。这就是为什么你在 catch
中使用 console.log(err)
时看不到输出的原因。
如果你想要捕获异步操作中的异常,可以使用 try...catch
包装 await
的方式(如果在异步函数中使用),或者通过 .catch
处理 Promise 的方式。
例如:
// 使用 async/await
async function exampleAsyncFunction() {
try {
await new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('err'));
}, 200);
});
} catch (err) {
console.log(err);
}
}
exampleAsyncFunction();
// 使用 .catch 处理 Promise
new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('err'));
}, 200);
}).catch((err) => {
console.log(err);
});
请注意,为了使用 await
,代码必须在异步函数中执行,因为 await
只能在异步函数中使用。
原文链接:codingdict.net