Я работаю над небольшим помощником, который должен вызывать произвольный код (передается как лямбда). Помощник должен поймать определенные исключения и бросить их в какую-нибудь обертку. Мои "собственные" исключения не должны быть обернуты, а просто переброшены.
Я придумал этот код:
@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;
}
}
}
Вышеприведенная информация дает ошибку компиляции:
Недостижимый блок catch для MyCheckedException. Это исключение никогда не выбрасывается из тела оператора try MyExceptionLogger...
Иными словами: хотя apply()
определено для того, чтобы бросать некоторые X extends Throwable
, я не могу поймать конкретное исключенное исключение при вызове этого метода.
Я знаю, что могу перейти к рабочему коду, поймав Throwable, чтобы использовать instanceof
check - но я хотел бы понять , почему невозможно попробуйте/поймать, как описано выше.