try...catch只能捕捉到同步执行代码块中的错误


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 中,setTimeoutPromise.resolve().then 中的异步操作是在主线程的事件循环之外执行的,因此 try...catch 语句无法捕获到这些异步操作中抛出的异常。

所以,虽然你在 setTimeoutPromise.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