将未经检查的异常包装为已检查的异常是否可行?
为什么会有这个问题?
我正在创建一个API,它将所有已检查的异常都封装在一个特定的API已检查的异常中。因此,我想知道未经检查的异常是否也可以包装在已检查的异常中。
对此有什么建议吗?如果它们可以被包装,那么请用一个可能有意义的情境来说明。
将未经检查的异常包装为已检查的异常是否可行?
为什么会有这个问题?
我正在创建一个API,它将所有已检查的异常都封装在一个特定的API已检查的异常中。因此,我想知道未经检查的异常是否也可以包装在已检查的异常中。
对此有什么建议吗?如果它们可以被包装,那么请用一个可能有意义的情境来说明。
已检查异常
应该用于调用者可以合理恢复的情况。通过抛出已检查异常,您强制调用者在catch子句
中处理异常或向外传播异常。API用户可以通过捕获Exception
并采取适当的恢复步骤来从异常条件中恢复。
例如,FileNotFoundException
是一个已检查异常
:
try {
FileInputStream fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
// HANDLE THE EXCEPTION
}
int[] aa = new int[2];
int ii = aa[2]; // java.lang.ArrayIndexOutOfBoundsException
由于访问数组元素的合同规定数组索引必须在0到数组长度减1之间,而我们违反了以上的先决条件。
再次假设您正在编写以下类
,其中areaCode
不能为null
。如果有人创建了一个没有areaCode
的,将来在使用时可能会造成更大的危害。在这种情况下,您可以使用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;
}
...
}
已检查异常(checked exceptions)
,如果无法进行恢复或者存在任何前提条件违规,则应使用运行时异常(Runtime exception)
。catch(Exception e)
之前没有明确使用catch(Runtime e)
,则无论如何都会包装未经检查的异常。除非有特定要求单独处理Runtime
异常,否则通常会遵循这种做法。ServiceException
。public void serviceA(String path) throws ServiceException {
try {
File f = new File(path); //Runtime - NPE etc
Reader r = .. //Checked IOException, may be some Runtime exception
}catch(Exception e) { //both runtime and checked
throw new ServiceException("CUSTOMMSG", e);
}
}
Runtime
异常将是非常特定的情况,因为服务契约是通过ServiceException
进行的,调用者了解并不知道如何处理Runtime
异常。DFA
,DFP
会抛出带有详细代码、消息和建议的已检查异常,而其它一些服务则不会。我不知道是否存在一个通用规则。 - harshthrows
子句和 JavaDoc 声明你的方法会抛出未经检查的异常。对此没有问题。 - markusw