В Java, если общее исключение будет перехвачено и переброшено, смогут ли внешние методы по-прежнему перехватывать определенные исключения? - PullRequest
0 голосов
/ 07 января 2012

В Java, если общее исключение будет перехвачено и переброшено, будут ли внешние методы по-прежнему способны перехватывать определенные исключения?

Другими словами, могу ли я сделать это:


try {
    try {
         //...
    } catch (Exception e) {
         //...
        throw e;
    }
} catch (SpecificException e) {
     //...
}

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Хотя ответ 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;
2 голосов
/ 07 января 2012

повторное выбрасывание исключения ничего не меняет в нем (это все тот же объект, который был изначально брошен).

0 голосов
/ 07 января 2012

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!");
        }
    }

}
...