Как выглядит правильный код повторного выброса для этого примера - PullRequest
2 голосов
/ 15 сентября 2011

Вчера я прочитал эту статью о новой обработке исключений в Java 7.

В статье показан пример (№ 4), который не работает в Java 6. Я простоскопировал его.

public class ExampleExceptionRethrowInvalid {

public static void demoRethrow()throws IOException {
    try {

        // forcing an IOException here as an example,
        // normally some code could trigger this.
        throw new IOException("Error");
    }
    catch(Exception exception) {
        /*
         * Do some handling and then rethrow.
         */
        throw exception;
    }
}

public static void main( String[] args )
{
    try {
        demoRethrow();
    }
    catch(IOException exception) {
        System.err.println(exception.getMessage());
    }
}
}

Как и в описанной статье, он не будет компилироваться из-за несоответствия типов -throws IOException- и -throw exception-.В Java 7 так и будет.Итак, мой вопрос.

Как правильно реализовать такого рода перебрасывание исключения в Java 6?Мне не нравится предложенный пример реализации № 5.Я знаю, что это вопрос вкуса и проблемы, с которыми вы пытаетесь справиться, если нет проверенных исключений или нет.Итак, что я могу сделать, чтобы получить исключение IOException и сохранить трассировку стека?Должен ли я изменить только улов на IOException и рискнуть не всех уловить?

Мне любопытны ваши ответы.

Ответы [ 4 ]

6 голосов
/ 15 сентября 2011

Просто перехватите IOException, вот так:

public static void demoRethrow()throws IOException {
    try {
        // forcing an IOException here as an example,
        // normally some code could trigger this.
        throw new IOException("Error");
    }
    catch(IOException exception) {
        /*
         * Do some handling and then rethrow.
         */
        throw exception;
    }
}

Если код внутри блока try может выдать проверенное исключение, отличное от IOException, компилятор отметит это как ошибкуТаким образом, вы не «рискуете [не поймать всех».

Если вас также интересуют непроверенные исключения, вы также можете перехватить и перебросить RuntimeException (вам не нужно объявлять это в предложении throws).

1 голос
/ 15 сентября 2011

catch (Exception ex) ловит как проверенные, так и непроверенные (RuntimeException) исключения.Таким образом, чтобы сделать его функционально эквивалентным, достаточно

public static void demoRethrow() throws IOException {
try {
    throw new IOException("Error");
}
catch(IOException exception) {
    throw exception;
}
catch(RuntimeException exception) {
    throw new IOException(exception);
}

, и компилятор обнаружит другие проверенные исключения (это хорошо для того, чтобы снова подумать о том, должны ли они на самом деле зайти так далеко, или должны были иметь смещение bean-компонента раньше)

1 голос
/ 15 сентября 2011

Catch IOException и все остальное отдельно:

public static void demoRethrow() throws IOException {
    try {
        throw new IOException("Error");
    }
    catch(IOException exception) {
        throw exception;
    }
    catch(Exception exception) {
        throw new IOException(exception);
}
0 голосов
/ 15 сентября 2011

Хакерский способ бросить, чтобы поймать универсальное исключение и перебросить без проверки компилятором исключения, это использовать stop.

public static void demoRethrow() throws IOException {
  try {
    throw new IOException("Error");

  } catch(Throwable t) {
    // handle exception

    // rethrow the exception without compiler checks.
    Thread.currentThread().stop(t);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...