Javascript和NodeJS异常捕获对比

Javascript和NodeJS异常捕获

✅ 一、浏览器中的 JS 异常捕获

✅ 1. 同步异常:用 try...catch

try {
  console.log(a); // 报错:a is not defined
} catch (err) {
  console.error("捕获错误:", err.message);
}

📌 特点:只能捕获同步代码的异常。


❌ 2. 异步异常:try...catch 无效

try {
  setTimeout(() => {
    throw new Error("异步错误");
  }, 100);
} catch (err) {
  console.log("捕获不到"); // ❌ 不会执行
}

✅ 解决方案 1:把错误逻辑写到回调中处理

setTimeout(() => {
  try {
    throw new Error("异步错误");
  } catch (err) {
    console.error("在回调内部捕获:", err.message);
  }
}, 100);

✅ 解决方案 2:Promise 错误用 .catch

Promise.reject("Promise 错误")
  .then(res => console.log(res))
  .catch(err => console.error("Promise 错误捕获:", err));

✅ 解决方案 3:async/awaittry...catch

async function test() {
  try {
    const res = await Promise.reject("Async 错误");
    console.log(res);
  } catch (err) {
    console.error("Async 捕获:", err);
  }
}
test();

✅ 二、Node.js 的异常捕获

Node.js 除了支持以上所有 JS 捕获方法,还提供了更多 全局和进程级的错误处理机制。


✅ 1. try...catch(同步和 async/await)

try {
  JSON.parse("invalid json");
} catch (e) {
  console.error("JSON解析失败:", e.message);
}

或 async 函数中:

async function run() {
  try {
    const data = await someAsyncFn();
  } catch (err) {
    console.error("捕获异步错误:", err.message);
  }
}

✅ 2. process.on('uncaughtException'):未捕获的同步异常

process.on('uncaughtException', (err) => {
  console.error('未捕获异常:', err);
});

throw new Error("boom"); // 没有 try,触发上面

⚠️ 使用后,进程不会崩溃,但建议用于记录日志后手动退出进程


✅ 3. process.on('unhandledRejection'):未处理的 Promise 异常

process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的 Promise 错误:', reason);
});

Promise.reject("出错啦!"); // 没有 .catch

✅ 4. 使用 domain 模块(已废弃,不推荐)

早期可用于捕获多个异步上下文中的错误,现在已不推荐。


🔥 三、综合实战示例(Node.js)

process.on("uncaughtException", (err) => {
  console.error("全局捕获异常:", err.message);
});

process.on("unhandledRejection", (reason) => {
  console.error("全局 Promise 异常:", reason);
});

function main() {
  // 同步异常
  throw new Error("同步炸了");
}

async function testAsync() {
  // 异步异常
  await Promise.reject("异步炸了");
}

main();
testAsync();

✅ 四、最佳实践总结

场景捕获方式
同步代码try...catch
异步 Promise.catch() / async + try/catch
未处理异常process.on('uncaughtException')
未处理 Promiseprocess.on('unhandledRejection')


🧠 提示:

  • 浏览器中不会有 process.on,那是 Node.js 专属。

  • 对于生产环境,建议你:

    • 捕获每个异步的 .catch

    • 使用日志系统记录 process.on(...) 的异常

    • 避免长期依赖 uncaughtException,会导致程序状态不可靠


需要我帮你写一个 Node.js 项目中的异常捕获封装工具(比如统一处理日志和响应),或者讲讲框架(如 Express/Koa)里如何处理错误?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穗余Theoweb3

家庭条件困难,望有打赏援助生活

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值