为什么我不能对引发泛型的调用的已检查异常进行捕获?
我正在研究一个小帮助程序,它应该调用任意代码(作为lambda传入)。帮助程序应捕获某些异常,并将它们放入某个包装器中。我的“自己的”异常不应该被包装,而只是重新抛出。
我想出了这个代码:
@FunctionalInterface
interface Processable<T, X extends Throwable> {
public T apply() throws X;
}
class MyCheckedException extends Exception { ... }
class MyCheckedExceptionWrapper extends MyCheckedException { ... }
public class MyExceptionLogger<T, X extends Throwable> {
public T process(Processable<T, X> processable) throws MyCheckedException {
try {
return processable.apply();
} catch (MyCheckedException thrown) { // this line isn't accepted
throw thrown;
} catch (Exception | LinkageError thrown) {
throw new MyCheckedExceptionWrapper(thrown);
} catch (Throwable thrown) {
... just log
return null;
}
}
}
上面给出了一个编译错误:
MyCheckedException 的无法访问的捕获块。此异常永远不会从 try 语句正文 MyExceptionLogger 中引发...
换句话说:虽然被定义为抛出一些,但在调用该方法时,我无法捕获特定的已检查异常。apply()
X extends Throwable
我知道我可以通过捕获Shrewable来开始工作代码,然后使用检查 - 但我想了解为什么不可能像上面概述的那样进行尝试/捕获。instanceof