什么是最好的内置JRE异常抛出来表示失败的“健全性检查”?

时间:2013-06-28 03:39:29

标签: java exception exception-handling

在运行时执行“健全性检查”时,抛出最好的内置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达到了什么,我应该抛出什么样的异常?”这不是正确的问题,但所有“健全性检查”都可以根据永远不会达到的代码进行“拼写”,因此它足够接近。

2 个答案:

答案 0 :(得分:3)

Java是面向对象的。

抛出SanityExceptionFailedSanityCheckException

换句话说,创建一个扩展Exception的类。

也许 MyCompanyException SanityException 更合适;)

如果您希望它是未经检查的运行时异常,请扩展RuntimeException

class SanityException extends RuntimeException {
    public SanityException(String msg) {
        super(msg);
    }
}

这非常容易且非常强大。

您的逻辑只能捕获并处理 SanityExceptions ,这很好。

我知道你的问题要求内置的例外...但如果你发现内置的选项令人反感,因为它们不够具体,那就是创建你自己的确切原因(特别是考虑它是多么容易)。

在我看来,这就是如何使用例外情况。

答案 1 :(得分:2)