正确使用 RuntimeException?

2022-09-01 18:00:59

可能的重复:
在Java中,我什么时候应该创建一个选中的异常,什么时候应该是运行时异常?

何时应从 中派生异常,而不是 ?RuntimeExceptionException

A 不必在方法的子句中声明,这可能是好的,因为它不必特别列出或不好,因为显式声明方法的异常是很好的做法。RuntimeExceptionthrows

思潮?


答案 1

来自 未经检查的例外 -- 争议

如果可以合理地期望客户机从异常中恢复,请使其成为已检查的异常。如果客户机无法执行任何操作来从异常中恢复,请将其设置为未选中的异常。

请注意,未选中的异常是从 RuntimeException 派生的异常,而已检查的异常是从 Exception 派生的异常

如果客户端无法执行任何操作来从异常中恢复,为什么要抛出 ?本文解释:RuntimeException

运行时异常表示由编程问题导致的问题,因此,无法合理地期望 API 客户端代码从中恢复或以任何方式处理它们。这些问题包括算术异常,例如除以零;指针异常,例如尝试通过空引用访问对象;和索引异常,例如尝试通过太大或太小的索引访问数组元素。


答案 2

在企业应用程序开发中,有许多方案可以使用 RuntimeException 而不是 Exception。以下是两种非常常见的此类方案:

  • 在将异常处理作为一个方面实现(分离关注设计原则)时,在大多数现代框架中,您将声明性处理异常并关联特定的异常处理块,而不是对其进行硬编码。一个很好的例子是Spring中的JDBC模板,它将所有SQL异常转换为RunningException,因此开发人员在编写数据访问逻辑时不会编写尝试捕获块。你可以以声明方式定义异常处理程序,它可以在开发环境中提供不同的行为。和生产中的不同行为。类似的实现也存在于 Struts 1.x Action 类中,其中执行方法被声明为抛出 Exception,并且在 struts-config 中映射了单独的 ExceptionHandler 来处理特定的异常。虽然这不是 RuntimeException 的示例,但设计原则是相同的,以分离正常执行和异常处理的关注点。
  • RuntimeException的另一个用途是在EJB和其他事务管理器中,其中事务是容器的控制器。按照惯例,在此类容器中,如果从代码中抛出 RuntimeException,事务将回滚 - 如果抛出异常,则不会发生同样的情况。

这是立即浮现在我脑海中的2个重要场景,但当然还有其他场景。