返回

JS 异常捕获机制:try-catch 与 Promise.catch 的区别

前端

许多 JavaScript 开发人员都认为 try-catch 语句可以捕获所有运行时异常,包括 Promise.catch 未捕获的异常。然而,事实并非如此。本文将深入探究 JS 异常捕获机制,揭示 try-catch 和 Promise.catch 的微妙区别。

try-catch:同步异常捕获

try-catch 语句可用于捕获在 JavaScript 同步代码中抛出的异常。同步代码在执行期间按顺序执行,异常也会立即抛出。在这样的情况下,try-catch 块可以有效地捕获异常并处理它们。例如:

try {
  // 同步代码
  throw new Error("同步异常");
} catch (err) {
  // 捕获同步异常
}

Promise.catch:异步异常捕获

Promise 是 JavaScript 中用于处理异步操作的类。它具有一个 catch() 方法,用于捕获未解决的 Promise 抛出的异常。当一个 Promise 被拒绝时(即出现异常时),它的 catch() 方法会被调用。例如:

const promise = new Promise((resolve, reject) => {
  // 异步代码
  reject(new Error("异步异常"));
});

promise.catch(err => {
  // 捕获异步异常
});

异常捕获的优先级

现在,让我们深入了解 try-catch 和 Promise.catch 的捕获优先级。当一个 Promise 在 try-catch 块中被执行时,try-catch 将会捕获该 Promise 抛出的异常。然而,如果 Promise.catch() 方法也被使用,那么 Promise.catch() 将会优先捕获异常。例如:

try {
  const promise = new Promise((resolve, reject) => {
    reject(new Error("异步异常"));
  });

  promise.catch(err => {
    // 捕获异步异常
  });
} catch (err) {
  // 不会被执行,因为异常已由 Promise.catch() 捕获
}

结论

理解 JavaScript 异常捕获机制对于编写健壮且可靠的代码至关重要。try-catch 用于捕获同步异常,而 Promise.catch 专门用于捕获异步异常。当两者同时存在时,Promise.catch() 具有更高的捕获优先级。牢记这些原则,你就可以有效地管理 JavaScript 异常,从而增强代码的稳定性。