贝利信息

javascript如何进行错误与异常处理【教程】

日期:2026-01-26 00:00 / 作者:夜晨
JavaScript错误处理靠try...catch、throw和监控机制实现可响应,仅捕获运行时异常,不捕获语法错误或未处理的Promise拒绝;Promise错误需用.catch()或await+try...catch捕获;应按错误类型分类处理,全局监听仅作兜底。

JavaScript 的错误处理不是靠“写得完美”来避免问题,而是靠 try...catchthrow 和恰当的监控机制把不可控变成可响应。

什么时候该用 try...catch

它只捕获**运行时异常(runtime errors)**,比如访问 undefined 的属性、JSON 解析失败、fetch 返回 404 后手动 response.json() 失败等。它不捕获语法错误、Promise 拒绝(unhandled rejection)、或异步回调里的同步错误(除非你在回调里自己包一层)。

Promise 链中的错误怎么捕获?

Promise 构造器内部抛出的错误会被自动转为拒绝状态,但必须用 .catch()await 配合 try...catch 捕获——不能靠外层 try...catch 包住 new Promise(...) 就完事。

常见错误写法:

try {
  new Promise((resolve, reject) => {
    throw new Error('boom'); // 这个错误不会被外层 try 捕获
  });
} catch (e) {
  console.log(e); // 永远不会执行
}

正确做法是:

如何区分不同错误类型并做针对性处理?

原生 JS 错误类型如 SyntaxErrorTypeErrorReferenceError 可以直接用 instanceof 判断;自定义错误建议继承 Error 并设 name 字段,方便分类。

示例:

class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = 'ValidationError';
  }
}

try {
  throw new ValidationError('用户名不能为空');
} catch (err) {
  if (err instanceof ValidationError) {
    showFormError(err.message);
  } else if (err.name === 'TypeError') {
    logToSentry(err);
  }
}

全局错误监听能替代 try...catch 吗?

不能。全局钩子如 window.onerrorwindow.addEventListener('error')process.on('uncaughtException')(Node.js)只作为兜底,用于日志收集和降级,无法阻止错误传播或恢复现场。

最常被忽略的是:异步操作中错误上下文丢失。比如在 setTimeout 或事件回调里抛错,堆栈里看不到原始调用链——这时候靠 error.stack 不够,得结合 console.trace() 或异步追踪库(如 cls-hooked)补全。