在 Node.js 环境下,异步代码的错误处理机制有哪些?请具体说明回调、Promise、async/await 和事件发射器这几种模式下的错误捕获与传递方式,并比较它们的优缺点。
考察说明
考查对 Node.js 异步错误处理模式的掌握程度和实际应用能力。
回答思路
- 【回答框架 1】Node.js 错误处理核心是错误优先回调,回调的第一个参数为错误对象,需显式检查并处理,否则错误会被吞没。Promise 通过 reject 传播错误,用 catch 捕获,支持链式传递。async/await 是 Promise 的语法糖,用 try/catch 捕获,错误可被同步化处理。事件发射器通过 error 事件捕获错误,若未监听会抛出异常。
- 【回答框架 2】回调模式需在每个回调中手动检查错误,代码易嵌套,但兼容旧代码。Promise 将错误从回调地狱中解耦,支持链式 catch 统一处理,但需注意在链中及时捕获。async/await 让异步代码更易读,try/catch 块能精确捕获,但需避免在循环或并发场景中误用。
- 【回答框架 3】错误处理需分层:底层捕获并标记错误,中层传递上下文,顶层统一记录和响应。对于未捕获的异常,可监听 process 的 uncaughtException 和 unhandledRejection 事件,但应仅用于日志和优雅退出,不宜继续运行。
- 【回答框架 4】实际项目中,应结合使用 async/await 和 Promise.all 处理并发,为每个异步操作添加超时和重试机制,并将业务错误与系统错误区分,使用自定义错误类型提高可诊断性。
- 【关键点 1】回调模式:错误优先回调,手动检查 err 参数。
- 【关键点 2】Promise 模式:reject 传递错误,catch 捕获,支持链式处理。
- 【关键点 3】async/await 模式:try/catch 捕获,代码同步化。
- 【关键点 4】事件发射器:监听 error 事件,否则进程崩溃。
- 【关键点 5】全局处理:process 的 uncaughtException 和 unhandledRejection 仅用于日志,不能恢复应用。
- 【易错点 1】盲目监听 uncaughtException 后继续运行,会导致状态不一致和资源泄漏。
- 【易错点 2】未处理的 Promise rejection 会静默失败,需在 Node 15+ 开启严格模式或使用全局处理。
- 【易错点 3】在 async 函数中忘记 try/catch,错误会被当作未处理 Promise rejection,难以排查。