【问题标题】:As a library designer, should I avoid AssertionErrors and throw Exceptions instead? [closed]作为库设计者,我应该避免 AssertionErrors 而是抛出异常吗? [关闭]
【发布时间】:2026-02-16 10:45:01
【问题描述】:

不是重复的:尽管与关于断言的其他问题类似,但此问题特别关注要分发给第三方的库中的断言与异常,更具体地说,是在不一定表明使用它的应用程序出现致命状况的库中.

对于具有重叠用例的其他问题,有许多相互矛盾的答案,使得大多数答案对我的具体情况相当模棱两可。


我维护Simple Java Mail,并且在代码中我有几个地方抛出了AssertionError,表明状态已变为无效,我作为库设计者不能保证正常运行。基本上这些都不应该发生,我将它们作为故障保护/故障快速包括在内。

现在用户有raised an issue,向我表明这种对 java 错误的使用是不合适的,因为它可能会停止整个应用程序,并且无论如何库用户可能会根据具体情况在某处实现异常处理(释义)。这对我来说也很有意义。

什么适合库:AssertionErrors 或 Exceptions?

另请参阅this answer to "Is actively throwing AssertionError in Java good practice?",其中 Google Guava(和 Joshua Bloch)似乎支持 Errors,但尚不完全清楚这是否也适用于库。

【问题讨论】:

  • 错误应该用来表示“事情太糟糕了,唯一的解决办法是关闭所有东西然后重新打开。”你的问题真的那么糟糕,以至于 JVM 正在做的所有其他事情都必须停止吗?还是只是“我的内部状态搞砸了。你必须扔掉我的一点,然后重新开始”?如果是后者,IllegalStateException 会更合适:你实际上是在说你处于一个糟糕的状态,而不是有点模糊的“东西坏了,很糟糕”。
  • 在我的特殊情况下,我认为是后一种情况,所以你会建议例外,对吗?
  • 这能回答你的问题吗? Java assertions underused
  • @BennyBottema 是的。您可能会发现参考这里的汇总表 github.com/google/guava/wiki/ConditionalFailuresExplained 会很有帮助,它简明扼要地描述了在 Guava 中使用哪些异常类型的原理。
  • 这个意见的依据是什么 - 正如您在问题中所说,您的用户认为抛出 AssertionError 是错误的,但 Bloch 说没关系。很明显,这是一个问题或意见。 “如果不在 * 上,我在哪里可以找到答案?” - 试试 Quora。 (是什么让您认为存在>>is

标签: java exception assertion


【解决方案1】:

你的想法是对的。在 Java 中,您可以使用异常来指示操作何时无法继续。例如 MalformedURLException 和 NumberFormatException。

我要指出的预构建异常是 IllegalStateException,但您也可以创建自己的异常,在这种情况下,您需要考虑它是否应该扩展 Exception 或 RuntimeException。

【讨论】: