Node 的异常处理分几条线:同步代码用 try/catch;异步回调采用错误优先约定,回调的第一个参数永远是错误对象,要先判断再取结果;Promise 用 catch 或 async/await 包 try/catch。最危险的是未捕获的异常与未处理的 Promise 拒绝——它们会让进程直接退出,线上服务瞬间全挂。
兜底手段是在顶层注册 uncaughtException 与 unhandledRejection 记录现场日志,但这只是善后而非恢复手段——正确做法仍是修复具体错误,并配合 PM2 的自动重启策略把进程拉起。对 HTTP 服务来说,还要确保每条请求路径无论成功失败都会正常结束响应,避免连接悬挂占满句柄。
const fs = require('fs'); // 1. 错误优先回调:先判断错误 fs.readFile('not-exist.txt', 'utf8', (err, data) => { if (err) return console.error('读取失败: ' + err.message); console.log(data); }); // 2. async/await 配合 try/catch async function load() { try { const res = await fetch('https://example.com'); return await res.text(); } catch (err) { console.error('请求失败,走兜底逻辑'); return null; } } // 3. 进程级兜底:只记录日志,不假装恢复 process.on('uncaughtException', (err) => { console.error('未捕获异常,进程将退出: ' + err.stack); process.exit(1); });