正确使用RuntimeException?
可能重复:
在Java中,何时应该创建一个已检查的exception,何时应该是运行时exception?
我应该何时从RuntimeException
而不是Exception
派生Exception
?
RuntimeException
不必在方法的throws
子句中声明,这可能很好,因为它不必特别列出或坏,因为显式声明方法的exception是一种好习惯。
思考?
来自未经检查的例外 – 争议 :
如果可以合理地期望客户端从exception中恢复,请将其作为已检查的exception。 如果客户端无法执行任何操作以从exception中恢复,请将其设置为未经检查的exception。
请注意,未经检查的exception是从RuntimeException
派生的Exception
并且已检查的exception是从Exception
派生的Exception
。
如果客户端无法执行任何从exception中恢复的操作,为什么抛出RuntimeException
? 文章解释说:
运行时exception表示编程问题导致的问题,因此,无法合理地期望API客户端代码从它们恢复或以任何方式处理它们。 这些问题包括算术exception,例如除以零; 指针exception,例如尝试通过空引用访问对象; 索引exception,例如尝试通过索引太大或太小来访问数组元素。
在企业应用程序开发中有许多场景,您将使用RuntimeException而不是Exception,以下是两个非常常见的场景:
- 在将exception处理实现为一个方面(分离关注设计原则)时,在大多数现代框架中,您将声明处理exception并关联特定的exception处理块,而不是对其进行硬编码。 一个很好的例子是Spring中的JDBC模板,它将所有SQLexception转换为RuntimeException,因此开发人员在编写数据访问逻辑时不会编写try catch块。 您可以声明性地定义exception处理程序,它可以在dev env中提供不同的行为。 和不同的生产行为。 类似的实现也存在于Struts 1.x Action类中,其中execute方法被声明为抛出exception,并且在struts-config中有单独的ExceptionHandler用于处理特定exception。 虽然这不是RuntimeException的示例,但设计原则是相同的,以分离正常执行和exception处理的关注。
- RuntimeException的另一个用途是在EJB和其他事务管理器中,其中事务是按容器控制的。 按照惯例在这样的容器中,如果从代码中抛出RuntimeException,事务就会回滚 – 如果你抛出exception就不会发生同样的情况
这两个场景立即浮现在我脑海中,会有其他场景。