【问题标题】:Proper use of RuntimeException? [duplicate]正确使用RuntimeException? [复制]
【发布时间】:2011-05-13 03:19:12
【问题描述】:
【问题讨论】:
标签:
java
exception
runtimeexception
【解决方案1】:
来自Unchecked Exceptions -- The Controversy:
如果可以合理地预期客户
从异常中恢复,让它
已检查的异常。如果一个客户
不能做任何事情来恢复
例外,将其设为未选中
例外。
请注意,未经检查的异常是从RuntimeException 派生的,而已检查的异常是从Exception 派生的。
如果客户端无法从异常中恢复,为什么要抛出RuntimeException?文章解释:
运行时异常代表问题
这是编程的结果
问题,因此,API 客户端
不能合理地期望代码
从他们身上恢复或处理他们
反正。此类问题包括
算术异常,例如
除以零;指针异常,
比如试图访问一个对象
通过空引用;和索引
例外情况,例如试图
通过一个访问数组元素
索引太大或太小。
【解决方案2】:
在企业应用程序开发中有许多场景,您会使用 RuntimeException 而不是 Exception。以下是两种非常常见的情况:
- 在将异常处理作为一个方面来实现(分离关注设计原则)时,在大多数现代框架中,您将声明式处理异常并关联特定的异常处理块,而不是对其进行硬编码。一个很好的例子是 Spring 中的 JDBC 模板,它将所有 SQL 异常转换为 RuntimeException,因此开发人员在编写数据访问逻辑时不会编写 try catch 块。您可以以声明方式定义异常处理程序,该处理程序可以在开发环境中提供不同的行为。以及生产中的不同行为。在 Struts 1.x Action 类中也有类似的实现,其中执行方法被声明为抛出异常,并且在 struts-config 中映射了单独的 ExceptionHandler 用于处理特定的异常。虽然这不是 RuntimeException 的例子,但设计原理是一样的,将正常执行和异常处理的关注点分开。
- RuntimeException 的另一个用途是在 EJB 和其他事务管理器中,其中事务由容器控制。按照惯例,在此类容器中,如果您从代码中抛出 RuntimeException,则事务将回滚 - 如果您抛出异常,则不会发生同样的情况。
这是我立即想到的两个重要场景,但当然还有其他场景。