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
try...catch
所以,虽然你在 setTimeout 和 Promise.resolve().then 中使用了 throw new Error('err'),但是它们实际上不会被相应的 catch 语句捕获。这就是为什么你在 catch 中使用 console.log(err) 时看不到输出的原因。
throw new Error('err')
catch
console.log(err)
如果你想要捕获异步操作中的异常,可以使用 try...catch 包装 await 的方式(如果在异步函数中使用),或者通过 .catch 处理 Promise 的方式。
await
.catch
例如:
// 使用 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