菜单

错误处理最佳实践

相关源文件

错误处理是构建健壮的 Node.js 应用程序的关键方面。本页面概述了在应用程序执行期间发生的错误的管理、分类、捕获和响应的推荐方法。妥善的错误处理通过优雅地处理意外情况来增强应用程序的稳定性、改进调试并提供更好的用户体验。

有关生产中错误监控的信息,请参阅生产实践,有关与安全相关的错误预防,请参阅安全最佳实践

内容

集中式错误处理

最有效的错误处理方法是将错误集中到一个专用的错误处理程序中,而不是将错误处理逻辑分散到整个应用程序中。这可以确保一致的错误处理、日志记录和响应生成。

错误处理程序组件

创建一个专用的错误处理程序组件,该组件

  1. 接收来自所有来源(API 路由、计划任务、消息队列)的错误
  2. 记录带有适当上下文的错误
  3. 决定是崩溃进程(针对程序员错误)还是继续运行(针对操作错误)
  4. 为客户端格式化错误响应

错误处理程序实现示例

在 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

始终使用 async/await 或 promises 而不是回调来处理异步错误。这确保了正确的错误传播和更整洁的代码。

在返回前始终 await Promises

从异步函数返回 promises 时,请始终先 await 它们,以确保完整的堆栈跟踪。

捕获未处理的 Promise 拒绝

注册一个未处理的 Promise 拒绝的处理器,以防止静默失败

来源:sections/errorhandling/catchunhandledpromiserejection.md6-7 sections/errorhandling/returningpromises.basque.md5-7

错误文档

妥善记录可能的错误,以帮助 API 消费者妥善处理它们。

API 错误文档

对于 RESTful API,请使用 OpenAPI(以前称为 Swagger)来记录可能的错误响应

对于 GraphQL API,请在您的模式文档中包含可能的错误

来源:sections/errorhandling/documentingusingswagger.md4-5 sections/errorhandling/documentingusingswagger.md43-49

错误日志记录

使用成熟的日志记录库以提高错误的可见性和可追溯性。

日志记录最佳实践

  1. 使用 Pino 或 Winston 等成熟的日志记录库
  2. 在每个日志中包含上下文信息
  3. 使用适当的日志级别(debug、info、warn、error)
  4. 包含事务 ID 以跨服务关联日志

使用 APM 产品

考虑使用应用程序性能监控 (APM) 产品来自动检测和跟踪生产中的错误

  1. 它们提供实时错误跟踪
  2. 帮助识别错误模式
  3. 提供性能指标以查找缓慢的代码路径
  4. 关于异常错误率的警报

来源:sections/errorhandling/usematurelogger.md4-12 sections/errorhandling/usematurelogger.md16-26

错误流程测试

彻底测试错误场景,而不仅仅是正常流程。

错误流程测试策略

  1. 测试函数是否抛出预期的错误
  2. 测试 API 端点是否返回正确的错误状态码
  3. 测试错误处理中间件
  4. 测试全局错误处理程序

来源:sections/errorhandling/testingerrorflows.md4-5 sections/errorhandling/testingerrorflows.md7-13

高级错误处理模式

使用专用库进行快速验证

使用验证库在处理前快速捕获无效输入

优雅地关闭进程

当发生灾难性错误时,优雅地关闭

来源:sections/errorhandling/failfast.md4-5 sections/errorhandling/shuttingtheprocess.md4-5

错误处理流程

下图说明了典型 Node.js 应用程序中完整的错误处理流程

此图显示了错误如何在应用程序的不同层级之间传播,并最终被集中式错误处理程序处理。

来源:sections/errorhandling/centralizedhandling.md7-9