在运行时执行“健全性检查”时,最好的内置函数是什么Exception
来指示逻辑错误?InternalError
很诱人,但据Error
我了解,它应该只用于指示 JVM 本身的问题,而不是应用程序逻辑错误。现在我倾向于抛出RuntimeException
s,但我觉得这很令人反感,因为类型太笼统了。我应该使用更具体的类型吗?
我避免使用assert
这些检查,因为它们仍应在生产中执行。出于这个原因,“你应该使用assert
”不是正确的答案。
对于这个问题的主观性质,我深表歉意,但我希望有一些我不知道的众所周知的最佳实践。
编辑:这是我正在谈论的一个很好的例子,虽然当然还有其他很好的例子而且这个想法更普遍:
public static void foobar(ModelObject o) {
switch(o.getEnumProperty()) {
case ENUMVALUE1:
// Handle...
break;
case ENUMVALUE2:
// Handle...
break;
default:
// In theory, this should never be reached. The code should handle any
// enum value it's Java-legal for the code to pass. But, if a new
// enum value is added and this code is not updated, this WILL be
// reached. This is not an IllegalArgumentException because the caller
// passed a valid value -- remember, we SHOULD handle any enum value
// here -- but the code has not been updated. For this reason, it's an
// "internal error" of sorts. However, there's no good "my program's
// logic is broken" Exception that I know of built into the JRE. It is
// this Exception that I'm looking for in this question.
//
// Hopefully this clarifies the question somewhat.
throw new RuntimeException("Unhandled: "+o.getType());
}
}
我想表达这个问题的更具体的方式是“如果在生产环境中存在永远不应该达到的代码,但可以达到GETS,我应该抛出什么样的异常?” 这不完全是正确的问题,但所有“健全性检查”都可以用永远不应该到达的代码来“拼写”,所以它足够接近。