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/await 用 try...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') |
| 未处理 Promise | process.on('unhandledRejection') |
🧠 提示:
-
浏览器中不会有
process.on,那是 Node.js 专属。 -
对于生产环境,建议你:
-
捕获每个异步的
.catch -
使用日志系统记录
process.on(...)的异常 -
避免长期依赖
uncaughtException,会导致程序状态不可靠
-
需要我帮你写一个 Node.js 项目中的异常捕获封装工具(比如统一处理日志和响应),或者讲讲框架(如 Express/Koa)里如何处理错误?

2204

被折叠的 条评论
为什么被折叠?



