正确使用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就不会发生同样的情况

这两个场景立即浮现在我脑海中,会有其他场景。