В Java, если общее исключение будет перехвачено и переброшено, смогут ли внешние методы по-прежнему перехватывать определенные исключения?
В Java, если общее исключение будет перехвачено и переброшено, смогут ли внешние методы по-прежнему перехватывать определенные исключения?
Другими словами, могу ли я сделать это:
try {
try {
//...
} catch (Exception e) {
//...
throw e;
}
} catch (SpecificException e) {
//...
}
3 ответа
Хотя ответ jtahlborn верен, есть еще одно признание: компилятор увидит, что вы генерируете исключение универсального типа (даже если во время выполнения это может быть только определенный класс), и заставит вас объявить универсальное исключение в заголовок метода.
private void test() throws FileNotFoundException {
try {
throw new FileNotFoundException("Es una exception");
} catch (IOException e) {
throw e; <-- Error because the method only throws
FileNotFoundException, not IOException
}
}
e
действительно является FileNotFoundException, но так как он объявлен как IOException, компилятор работает с более широким классом. То, что вы можете сделать, это "бросить" исключение.
throw (FileNotFoundException) e;
Повторное выбрасывание исключения ничего не меняет в нем (это все тот же объект, изначально выданный).
Eclipse помечает "throw e" во внутренней перехватчике как необработанное исключение, НО оно перехватывает исключение, потому что когда я запускаю это, оно печатает "Сработало!". Спасибо @jtahlborn. К сожалению, это означает, что где-то все еще должен быть ненужный блок try/catch.
public class Tester {
public static void main(String[] args) {
try {
try {
throw new SpecificException("Test!");
} catch (Exception e) {
throw e;
}
} catch (SpecificException e) {
System.out.println("It worked!");
}
}
}