Java 要抛出什么样的内置JRE异常来表示失败;健康检查;?

Java 要抛出什么样的内置JRE异常来表示失败;健康检查;?,java,exception,exception-handling,Java,Exception,Exception Handling,在运行时执行“健全性检查”时,为了指示逻辑错误,要抛出的最佳内置异常是什么?这很诱人,但作为一个错误我的理解是,它应该只用于指示JVM本身的问题,而不是应用程序逻辑错误。现在我倾向于抛出RuntimeExceptions,但我觉得这很不舒服,因为类型太一般了。我是否应该使用更具体的类型 我避免对这些检查使用assert,因为它们仍然应该在生产中执行。因此,“您应该使用assert”不是正确答案 我为这个问题的主观性道歉,但我希望有一些我不知道的众所周知的最佳实践 编辑:这里有一个很好的例子来说明

在运行时执行“健全性检查”时,为了指示逻辑错误,要抛出的最佳内置
异常是什么?这很诱人,但作为一个
错误
我的理解是,它应该只用于指示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());
    }
}

我想用一种更具体的方式来表达这个问题是“如果在生产环境中存在永远不应该到达但却能够到达的代码,我应该抛出什么样的异常?”这并不是一个正确的问题,但所有的“健全性检查”都可以用永远不应该到达的代码来“拼写”,所以它足够接近了。

有一个
AssertionError
throwable异常。请参见

存在一个可丢弃的异常。请参见

Java是面向对象的

抛出一个
SanityException
或一个
FailedSanityCheckException

换句话说,创建自己的类来扩展异常

也许MyCompanyException比SanityException更合适;)

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

它非常简单,功能也非常强大

您的逻辑只能捕获和处理SanityException,这很好

我知道你的问题要求一个内置的异常。。。但是,如果你觉得内置选项不够具体而令人厌恶,那就是创建自己的选项的确切原因(特别是考虑到它有多么容易)


在我看来,这就是异常的使用方式。

Java是面向对象的

抛出一个
SanityException
或一个
FailedSanityCheckException

换句话说,创建自己的类来扩展异常

也许MyCompanyException比SanityException更合适;)

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

它非常简单,功能也非常强大

您的逻辑只能捕获和处理SanityException,这很好

我知道你的问题要求一个内置的异常。。。但是,如果你觉得内置选项不够具体而令人厌恶,那就是创建自己的选项的确切原因(特别是考虑到它有多么容易)


在我看来,这就是使用异常的方式。

我可以仔细思考,而且是肯定的。两者都是很好的例子,我都大量使用。你能想出更接近“生产断言”的东西吗?你所说的“理智检查”是什么意思?你说得对,我说得相当口语化。在我使用它时,“健全性检查”基本上只是一个逻辑验证。一个很好的例子可能是
枚举类型的
开关中的
。对于每个
enum
值,您应该有一个
case
,然后在末尾有一个
default
。您的
默认值
应该抛出一个
异常
,因为每个值都有一个
大小写
。如果够着它,你应该扔什么?不是
IllegalArgumentException
,因为参数是有效的;程序只是没有正确处理有效的输入。它不是一个
断言,因为它应该在生产环境中工作。听起来像是一个非法的argumentexception。。。这个问题很奇怪。我可以仔细思考,而且是肯定的。两者都是很好的例子,我都大量使用。你能想出更接近“生产断言”的东西吗?你所说的“理智检查”是什么意思?你说得对,我说得相当口语化。在我使用它时,“健全性检查”基本上只是一个逻辑验证。一个很好的例子可能是
枚举类型的
开关中的
。对于每个
enum
值,您应该有一个
case
,然后在末尾有一个
default
。您的
默认值
应该抛出一个
异常
,因为每个值都有一个
大小写
。如果够着它,你应该扔什么?不是
IllegalArgumentException
,因为参数是有效的;程序只是没有正确处理有效的输入。它不是一个
断言,因为它应该在生产环境中工作。听起来像是一个非法的argumentexception。。。这个问题很奇怪。如果你抛出这个问题,整个应用程序将停止工作。@LuiggiMendoza如果断言失败,这就是想法,对吗?@Patashu当遇到
错误时,JVM将关闭。我认为这不是用户所期望的,更糟糕的是,如果这是一个可以同时拥有多个用户的应用程序,例如一个web应用程序。@LuiggiMendoza我同意,应用程序不应该停止工作。@Luiggi Mendoza错误也可能被捕获,在执行可能过时的代码(如插件)时捕获断言错误似乎是合理的。如果抛出此错误,整个应用程序将停止工作。@LuiggiMendoza如果断言失败,这就是想法,对不对?@Patashu当遇到
错误时,JVM将关闭。我认为这不是用户所期望的,更糟糕的是,如果这是一个可以同时拥有多个用户的应用程序,例如web应用程序。@LuiggiMendoza我同意,应用程序不应该停止工作。@Luiggi Mendoza错误
class SanityException extends RuntimeException {
    public SanityException(String msg) {
        super(msg);
    }
}