本文档介绍了如何在 Node.js 应用程序中对不同类型的错误进行分类,并为每种类型实施适当的处理策略。理解不同错误类别的区别对于构建能够优雅地处理故障的弹性应用程序至关重要。有关集中式错误处理架构的信息,请参阅集中式错误处理。有关使用 Promise 处理异步错误的信息,请参阅使用 Promise 处理异步错误。
Node.js 错误处理中的基本区别在于运营错误和程序员错误。此分类决定了如何在运行时处理错误。
运营错误:
程序员错误:
来源:sections/errorhandling/operationalvsprogrammererror.md3-5 sections/errorhandling/shutingtheprocess.md4-5 sections/errorhandling/operationalvsprogrammererror.basque.md3-5
要在代码中实施此区分,可以标记错误为运营错误(可信)或程序员错误(不可信)
对于集中式方法,使用其他属性扩展 Error 对象
来源:sections/errorhandling/operationalvsprogrammererror.md7-58 sections/errorhandling/useonlythebuiltinerror.md40-62
来源:sections/errorhandling/shuttingtheprocess.md4-5 sections/errorhandling/operationalvsprogrammererror.md60-85
所有错误都应被路由到一个中央处理程序,而不是在应用程序的不同部分单独处理
集中式错误处理程序提供以下好处
中央错误处理程序负责
来源:sections/errorhandling/centralizedhandling.md5 sections/errorhandling/centralizedhandling.md84-100
当检测到程序员错误时,应用程序可能处于不一致状态。在这种情况下,最安全的方法是
来源:sections/errorhandling/shuttingtheprocess.md7-32 sections/errorhandling/operationalvsprogrammererror.md77-85
Promises 带来了一个特殊的挑战——在没有正确.catch()处理程序的 Promise 链中抛出的错误不会触发uncaughtException事件。要捕获这些错误
来源:sections/errorhandling/catchunhandledpromiserejection.md5-7 sections/errorhandling/catchunhandledpromiserejection.md22-42
对于函数参数和输入,尽早验证以防止级联错误
此策略
Joi 等工具可以简化复杂的验证
来源:sections/errorhandling/failfast.md3-25
始终使用 JavaScript 的内置 Error 对象(或其扩展),而不是字符串或自定义错误类型
| 做 | 不做 |
|---|---|
throw new Error('错误信息') | throw '错误信息' |
new AppError(type, msg, true) | 不继承自 Error 的自定义错误对象 |
使用内置 Error 的好处
来源:sections/errorhandling/useonlythebuiltinerror.md3-5 sections/errorhandling/useonlythebuiltinerror.md9-29
将错误处理与成熟的日志解决方案相结合
日志记录最佳实践
来源:sections/errorhandling/usematurelogger.md3-12 sections/errorhandling/usematurelogger.md16-26
对于 REST API
对于 GraphQL
来源:sections/errorhandling/documentingusingswagger.md3-7 sections/errorhandling/documentingusingswagger.md9-42
与成功路径一起测试错误场景
测试不同类型的错误
来源:sections/errorhandling/testingerrorflows.md3-5 sections/errorhandling/testingerrorflows.md8-20
完整的错误处理系统结合了分类、集中处理和适当的响应策略
来源: sections/errorhandling/centralizedhandling.md5 sections/errorhandling/operationalvsprogrammererror.md3-30 sections/errorhandling/shuttingtheprocess.md4-32
应用程序性能监控 (APM) 工具有助于检测错误和性能问题
| APM 类别 | 目的 | 示例 |
|---|---|---|
| 网站/API 监控 | 外部正常运行时间和性能检查 | Pingdom, Uptime Robot, New Relic |
| 代码插桩 | 内部性能和错误跟踪 | New Relic, App Dynamics |
| 运维智能 | 聚合指标和仪表板 | Datadog, Splunk, Zabbix |
这些工具提供
来源: sections/errorhandling/apmproducts.md3-6 sections/errorhandling/apmproducts.md12-20
关于错误处理,有三种主要思想
Node.js 社区普遍偏爱平衡的方法,并遵循以下关键原则:
来源: sections/errorhandling/operationalvsprogrammererror.md77-85 sections/errorhandling/shuttingtheprocess.md86-93