【发布时间】: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