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);
}
}