Node.js 错误处理
健壮的错误处理机制是 Node.js 应用稳定运行的保障,掌握各类错误捕获方式至关重要。
同步错误处理
使用 try-catch 捕获同步代码中的错误:
JavaScript
function divide(a, b) {
if (b === 0) {
throw new Error('除数不能为零');
}
return a / b;
}
try {
const result = divide(10, 0);
console.log(result);
} catch (err) {
console.error('捕获错误:', err.message);
}
异步回调错误处理
回调函数中的错误通过第一个参数传递:
JavaScript
fs.readFile('not-exist.txt', 'utf8', (err, data) => {
if (err) {
console.error('文件读取失败:', err.message);
return;
}
console.log(data);
});
Promise 错误处理
JavaScript
// catch 方法
fs.promises.readFile('file.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.error(err));
// async/await + try-catch
async function readFile() {
try {
const data = await fs.promises.readFile('file.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('读取失败:', err.message);
}
}
EventEmitter 错误处理
未监听 error 事件会触发进程崩溃:
JavaScript
const EventEmitter = require('events');
const emitter = new EventEmitter();
// 必须监听 error 事件
emitter.on('error', (err) => {
console.error('捕获错误事件:', err.message);
});
emitter.emit('error', new Error('发生错误'));
EventEmitter 触发 error 事件时,如果没有监听器,Node.js 会抛出异常并退出进程。
全局错误处理
JavaScript
// 未捕获的异常
process.on('uncaughtException', (err) => {
console.error('未捕获异常:', err);
process.exit(1);
});
// 未处理的 Promise 拒绝
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的 Promise 拒绝:', reason);
});
错误类型
| 错误类型 | 说明 |
|---|---|
| Error | 通用错误 |
| TypeError | 类型错误 |
| ReferenceError | 引用错误 |
| SyntaxError | 语法错误 |
| RangeError | 范围错误 |
要点总结
- 同步错误用 try-catch 捕获
- 回调错误遵循 Error-First 模式,检查第一个参数
- Promise 错误用 .catch() 或 try-catch + async/await
- EventEmitter 必须监听 error 事件,否则进程崩溃
- 全局错误处理作为最后防线,记录日志后应退出进程
📝 发现内容有误?点击此处直接编辑