错误处理是构建健壮的 Node.js 应用程序的关键方面。本页面概述了在应用程序执行期间发生的错误的管理、分类、捕获和响应的推荐方法。妥善的错误处理通过优雅地处理意外情况来增强应用程序的稳定性、改进调试并提供更好的用户体验。
有关生产中错误监控的信息,请参阅生产实践,有关与安全相关的错误预防,请参阅安全最佳实践。
最有效的错误处理方法是将错误集中到一个专用的错误处理程序中,而不是将错误处理逻辑分散到整个应用程序中。这可以确保一致的错误处理、日志记录和响应生成。
创建一个专用的错误处理程序组件,该组件
错误处理程序实现示例
在 Express 应用程序中
来源:sections/errorhandling/centralizedhandling.md5-41 sections/errorhandling/centralizedhandling.md84-98 sections/errorhandling/centralizedhandling.md156-157
避免在中间件中直接处理错误,因为这使得处理计划任务或消息队列等其他来源的错误变得困难。
❌ 不正确的方法
来源:sections/errorhandling/centralizedhandling.md119-152
不同类型的错误需要不同的处理策略。主要类别是
| 错误类型 | 描述 | 示例 | 处理策略 |
|---|---|---|---|
| 操作错误 | 正常运行期间的预期问题 | - 无效的用户输入 - API 超时 - 服务不可用 | - 记录错误 - 继续执行 - 发送适当的响应 |
| 程序员错误 | 代码中的 bug | - 读取 undefined - 尝试调用非函数 - 内存泄漏 | - 记录错误 - 优雅地退出进程 - 通知开发人员 |
创建扩展内置 Error 对象的自定义错误类
抛出错误时,标记它们为操作错误或非操作错误
来源:sections/errorhandling/operationalvsprogrammererror.md4-5 sections/errorhandling/useonlythebuiltinerror.md40-91
始终使用 async/await 或 promises 而不是回调来处理异步错误。这确保了正确的错误传播和更整洁的代码。
从异步函数返回 promises 时,请始终先 await 它们,以确保完整的堆栈跟踪。
注册一个未处理的 Promise 拒绝的处理器,以防止静默失败
来源:sections/errorhandling/catchunhandledpromiserejection.md6-7 sections/errorhandling/returningpromises.basque.md5-7
妥善记录可能的错误,以帮助 API 消费者妥善处理它们。
对于 RESTful API,请使用 OpenAPI(以前称为 Swagger)来记录可能的错误响应
对于 GraphQL API,请在您的模式文档中包含可能的错误
来源:sections/errorhandling/documentingusingswagger.md4-5 sections/errorhandling/documentingusingswagger.md43-49
使用成熟的日志记录库以提高错误的可见性和可追溯性。
考虑使用应用程序性能监控 (APM) 产品来自动检测和跟踪生产中的错误
来源:sections/errorhandling/usematurelogger.md4-12 sections/errorhandling/usematurelogger.md16-26
彻底测试错误场景,而不仅仅是正常流程。
来源:sections/errorhandling/testingerrorflows.md4-5 sections/errorhandling/testingerrorflows.md7-13
使用验证库在处理前快速捕获无效输入
当发生灾难性错误时,优雅地关闭
来源:sections/errorhandling/failfast.md4-5 sections/errorhandling/shuttingtheprocess.md4-5
下图说明了典型 Node.js 应用程序中完整的错误处理流程
此图显示了错误如何在应用程序的不同层级之间传播,并最终被集中式错误处理程序处理。