17370845950

如何使用JavaScript进行错误处理_JavaScript的try-catch语句如何捕获异常
try-catch仅捕获运行时同步错误,如ReferenceError、TypeError等;不捕获异步错误、Promise拒绝及顶层SyntaxError。error对象含name、message、stack三字段。异步错误需配合async/await使用try-catch,或在回调中单独处理。

try-catch 能捕获哪些错误

它只捕获**运行时同步错误**,比如 ReferenceErrorTypeErrorSyntaxError(仅在 eval 中)、RangeError 等。但不会捕获:
– 异步错误(如 setTimeoutfetch 中抛出的错误)
– Promise 拒绝(需用 .catch()await + try-catch
– 语法错误(不在 eval 内的顶层 SyntaxError 会直接中断执行,无法被包围)

基本写法与 error 对象的关键字段

catch 块接收一个参数(通常叫 error),它至少包含三个可用属性:message(错误描述)、name(错误类型名)、stack(调用栈)。注意:不同浏览器对 stack 格式支持略有差异,不要依赖其固定结构做逻辑判断。

try {
  nonExistentFunction();
} catch (error) {
  console.log(error.name);     // "ReferenceError"
  console.log(error.message);  // "nonExistentFunction is not defined"
  console.log(error.stack);    // 包含文件名、行号等(开发环境有用,生产慎用)
}

如何正确处理异步操作中的错误

直接在 try 里写 fetchsetTimeout 不会捕获其内部错误。必须配合 async/await 才能让 try-catch 生效;若用回调,则需在回调内单独处理。

  • ✅ 正确(await 让 Promise rejection 转为 throw):
    async function loadData() {
      try {
        const res = await fetch('/api/data');
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        return await res.json();
      } catch (error) {
        console.error('加载失败:', error.message);
      }
    }
  • ❌ 错误(fetch 返回 Promise,但没 await,错误不会进 catch):
    try {
      fetch('/api/data').then(r => r.json()).catch(e => console.error(e));
    } catch (e) {
      // 这里永远进不来
    }

不要忽略 error.name 和具体类型判断

盲目统一处理所有错误容易掩盖真正问题。例如网络超时和 JSON 解析失败应区别对待——前者可重试,后者说明接口返回异常。用 instanceof 或比对 error.name 更稳妥:

try {
  JSON.parse(invalidJson);
} catch (error) {
  if (error instanceof SyntaxError) {
    console.warn('JSON 格式错误,跳过解析');
  } else if (error.name === 'TypeError') {
    console.error('传入了非字符串参数');
  }
}

注意:跨 iframe 或某些打包环境可能让 instanceof 失效,此时优先用 error.name === 'SyntaxError'