granam/exceptions-hierarchy

异常层次结构测试

5.1.0 2021-03-23 17:26 UTC

README

Test Coverage License

异常层次结构的哲学是“你必须知道”。

了解发生了什么很重要。而且它确实发生了...

系统失败了。发生了异常。

格外小心,尽可能多地获取问题的描述。

实现这一点的最好方法是保持异常层次结构整洁和清晰。

  • 遵循项目结构。
  • 根异常标记作为一个接口。
  • 将此接口包含在你产生的每个异常中。
    • 这样,任何人都可以通过单个捕获在其项目中捕获你的项目的异常
  • 了解逻辑异常和运行时异常之间的区别
    • 基本区别是逻辑异常可以在编译时检测到(例如,通过IDE),而运行时异常则不能 - 它只能在某些数据和环境的组合中出现
    • 逻辑异常应该在使用应用程序时确实存在错误时发生
      • 该异常告诉您:您正在使用某些不好的东西,请修复它
    • 运行时异常当然是除了逻辑异常之外的所有内容
      • 这意味着:您的应用程序不如应有的健壮 - 修复它或永远忽略它
    • 这很简单,界限清晰吗?
      • 当然不是
      • 但这样,您可以将所有逻辑异常捕获到“PersistentBugs”文件夹中,将运行时异常捕获到“BulletproofFailures”文件夹中

简而言之

运行时异常应该在“外部”有错误时发生。

逻辑异常应该在“内部”有错误时发生。

逻辑和运行时异常的使用示例

您构建了一个带API的电子商务。

您的前端应用程序向API发送了一个新客户的请求

  • 电子邮件:dontbotherme

这显然不是一个有效的电子邮件。前端检查失败,现在您被迫处理这个失败。

所以,让我们在代码中的某个地方抛出一个运行时(如InvalidEmailFormat)异常。

当然,您的API应该捕获此类异常,并返回400 Bad Request(以及描述性错误消息)。

在另一种情况下,您的应用程序计算购买价格,包括折扣券、数量折扣、忠诚度折扣等... 哇,最终价格是负数!

这当然是一个致命错误,源于您的应用程序内部。应该抛出逻辑异常(如FinalPriceZeroOrLesser)。

当然,API会捕获这个异常,将其转换为响应500 Server error(并记录该异常以便尽快修复)。