将 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/