triangle-exclamation错误处理

Promise 是 ES6 引入的异步编程解决方案,提供了更优雅的错误处理方式,核心通过 .catch() 方法捕获错误。

核心错误处理方式

  • .catch() 方法:捕获 Promise 链中「任意位置」抛出的错误(包括 reject 的错误和 then 回调中的同步错误),支持链式调用,一个 .catch() 可捕获前面所有 then 中的错误。

  • Promise 构造函数中的 reject:手动将 Promise 状态改为「失败」,传递错误对象。

  • throw关键字:在 then 回调中抛出的错误,会被后续的 .catch() 捕获(等价于 reject)。

circle-exclamation

注意事项

未捕获异常与未处理 Promise 拒绝的兜底处理

即使做了完善的错误捕获,程序仍可能出现未预期的未捕获异常(Uncaught Exception)和未处理 Promise 拒绝(Unhandled Rejection),若不进行兜底处理,会导致程序崩溃或进入不稳定状态。Node.js 提供了全局事件监听,用于捕获这些兜底错误。

捕获未捕获异常(uncaughtException)

uncaughtException 是 Node.js 进程的全局事件,用于捕获同步代码中未被 try/catch 捕获的异常异步代码中未被处理的同步错误(如 setTimeout 中未捕获的同步错误)。

// 全局监听未捕获异常
process.on("uncaughtException", err => {
  console.error("【兜底】捕获到未处理的全局异常:", err.message);
  console.error("错误调用栈:\n", err.stack);

  // 关键:记录日志后,优雅退出进程(避免进程进入不稳定状态)
  // 不推荐继续运行程序,因为异常可能导致资源泄露、数据不一致等问题
  process.exit(1); // 退出码 1 表示异常退出
});

// 模拟未捕获异常(同步代码)
throw new Error("这是一个未被 try/catch 捕获的同步异常");

// 模拟异步代码中的未捕获同步错误(也会被 uncaughtException 捕获)
// setTimeout(() => {
//   const obj = null;
//   obj.name; // 抛出 TypeError,未被捕获
// }, 1000);
circle-exclamation

注意事项

捕获未处理 Promise 拒绝(unhandledRejection)

unhandledRejection 是 Node.js 进程的全局事件,用于捕获未被 .catch() 处理的 Promise 拒绝(包括 reject 的错误和 await 未被 try/catch 捕获的错误)。

circle-exclamation

注意事项

生产环境中,建议结合「进程守护工具(如 PM2)」使用全局兜底事件:

  1. uncaughtException/unhandledRejection 事件中,优先记录详细日志(包括错误消息、调用栈、时间、环境信息)。

  2. 调用 process.exit(1) 退出当前进程。

  3. 配置 PM2 进程守护,当进程退出时,自动重启新进程,保证服务持续可用。

最后更新于