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/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)里如何处理错误?