菜单

错误处理

相关源文件

目的与范围

本文档概述了 JavaScript 应用程序中错误处理的最佳实践,重点介绍了如何正确捕获、处理和响应错误。妥善处理错误对于构建能够优雅地从故障中恢复并为用户和开发人员提供有意义反馈的健壮应用程序至关重要。

本节涵盖了使用 try/catch 块进行同步错误处理以及使用 Promise 进行异步错误处理,但不包括测试错误条件,这将在 测试 中讨论。

来源: README.md2003-2080

JavaScript 错误处理概述

JavaScript 提供了几种错误处理机制,包括用于同步代码的 try/catch 结构以及用于异步操作的基于 Promise 的错误处理。妥善处理错误可确保您的应用程序能够

  1. 检测何时出现问题
  2. 防止级联故障
  3. 提供有意义的反馈
  4. 记录或报告错误以供以后分析
  5. 在可能的情况下尝试恢复

下图说明了 JavaScript 中错误处理的基本流程

来源: README.md2003-2009

核心原则

1. 错误是有价值的

抛出的错误是有益的,因为它们

  • 指示运行时已识别出问题
  • 在故障点停止执行
  • 提供堆栈跟踪以帮助调试
  • 启用适当的恢复路径

不要将错误视为需要隐藏的问题,而应将其视为有助于提高应用程序可靠性的宝贵信号。

来源: README.md2003-2009

2. 始终处理已捕获的错误

错误处理中最重要的原则是永远不要忽略错误。如果您捕获了错误,您应该始终对它进行有意义的处理。

反模式:忽略已捕获的错误

捕获错误而不进行妥善处理会阻止您修复问题或适当地做出响应。

推荐方法:妥善处理错误

捕获错误时,请实施适当的错误处理策略

  • 使用 console.error() 而不是 console.log() 以获得更好的可见性
  • 在适当的时候通知用户
  • 将错误报告给监控服务
  • 在可能的情况下实施恢复逻辑

来源: README.md2010-2043

3. 不要忽略被拒绝的 Promise

同样的原则也适用于基于 Promise 的代码——始终妥善处理拒绝。

反模式:不当的 Promise 错误处理

推荐方法:妥善的 Promise 错误处理

来源: README.md2045-2078

错误处理模式

同步错误处理

同步代码使用 try/catch 机制来处理错误。每当执行可能引发错误的aught 代码时,都应使用此模式。

来源: README.md2010-2043

异步错误处理

JavaScript 提供了两种处理异步错误的主要模式

1. 基于 Promise 的错误处理

2. Async/Await 错误处理

虽然在存储库的错误处理部分没有明确说明,但 async/await 是处理异步操作及其错误的现代方法。它结合了 Promise 的优点和同步代码的可读性。

来源: README.md2045-2078 README.md1956-1999

错误处理策略

处理错误时,您应根据错误的上下文和严重性实施一项或多项这些策略

策略目的何时使用示例
日志记录记录错误详细信息以供调试始终console.error(error)
用户通知告知用户相关错误面向用户的操作notifyUserOfError(error)
错误报告将错误发送到监控服务生产环境reportErrorToService(error)
恢复尝试恢复或提供后备方案当有替代方案时return fallbackValue

来源: README.md2010-2043 README.md2045-2078

与其他整洁代码原则的关系

错误处理并非孤立存在——它与其他整洁代码原则相互作用

与函数设计的集成

函数的设计应考虑错误处理

  1. 函数应在适当的时候抛出错误以表明失败
  2. 函数应记录它们可能抛出的错误
  3. 函数应处理它们可以解决的错误,并传播它们无法处理的错误

与并发的集成

在异步代码中,错误处理尤为重要

  1. 始终将 .catch() 处理程序附加到 Promise
  2. 在 async/await 中使用 try/catch
  3. 对于并行操作,请考虑 Promise.all 错误处理

来源: README.md2003-2080 README.md1956-1999

总结

妥善处理错误是 JavaScript 中整洁代码的一个基本方面。遵循这些原则

  1. 切勿忽略已捕获的错误
  2. 始终处理 Promise 拒绝
  3. 实施适当的错误处理策略
  4. 将错误处理与其他整洁代码实践集成

您可以创建更健壮、更易于维护的应用程序,这些应用程序能够优雅地处理故障并为用户和开发人员提供有价值的反馈。

来源: README.md2003-2080