java - 在已检查异常中包装未检查异常

标签 java exception-handling

将 Unchecked 异常包装到 Checked 异常中作为一种做法是否可取?

为什么问这个问题?

我正在创建一个 API,它将所有已检查的异常包装到特定于 API 的已检查异常中。所以我想知道是否也可以将未经检查的异常包装在已检查的异常中。

有什么建议吗?如果可以将它们包装起来,如果能用有意义的情况进行说明,那就太好了。

最佳答案

Checked exceptions 应用于可以合理恢复调用者的情况。通过抛出已检查的异常,您将强制调用者在 catch 子句 中处理异常或将其向外传播。 API 用户可以通过捕获 Exception 并采取适当的恢复步骤从异常情况中恢复。

例如,FileNotFoundException 是一个checked exception:

try {
    FileInputStream fis = new FileInputStream(file);
    } catch (FileNotFoundException e) {
    // HANDLE THE EXCEPTION
}

即使找不到文件,如果用户采取适当的恢复步骤(从不同位置读取文件等),也可以继续执行应用程序。

另一方面,运行时异常应该用来表示恢复是不可能的,继续执行会造成更大的伤害。很多时候,运行时异常 用于指示违反前提条件:已定义为使用您的 API 的契约(Contract)被您的 API 客户端违反。

例如,ArrayIndexOutOfBoundsException 是一个运行时异常:

int[] aa = new int[2];
int ii = aa[2]; // java.lang.ArrayIndexOutOfBoundsException

因为访问数组元素的约定规定数组索引必须介于零和数组长度减一之间,而我们违反了上述前提条件。

同样,假设您正在编写如下所示的类 Address,其中 areaCode 不能为 null。如果有人在没有 areaCode 的情况下创建了 Address,那么将来在使用 Address 时可能会造成更大的危害。在这里,您可以使用 IllegalArgumentException(这是一个运行时异常)来指示:

public class Address {
private String areaCode;

public Address(String areaCode) {
    if (areaCode == null) {
        throw new IllegalArgumentException("Area Code cannot be NULL");
    }
    this.areaCode = areaCode;
}
...
}

因此,建议在可能恢复的地方使用已检查的异常,如果无法恢复或存在任何前提条件违反,则最好使用运行时异常.

关于java - 在已检查异常中包装未检查异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20192696/

相关文章:

php - Symfony 2.4 : Why are 500 errors not caught by kernel. 异常监听器

c# - 当异常处理所有其他代码路径时,方法末尾的 'return true' 是不好的做法吗?

java - Apache poi 单元格格式

java - 即使我使用异步线程,主线程也会做太多工作(UI 滞后)

java - Hibernate/@ElementCollection 和 @XmlRootElement

java - 在prepareStatement中出现错误

java - SecretKey.getEncoded() 如何为 PBE 生成的 key 返回明文密码?

python - 为什么尝试在Python 3.7的Visual Studio代码中使用except block无法工作?

c++ - 如何捕获构造函数异常?

oracle - 如何在异常处理 block 中重新引发pl/sql异常?