Неужели это `try..catch..finally` избыточно?

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } catch (Exception e) {
        throw e;
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

Это ведет себя иначе, чем если бы мы опускали предложение catch?

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

[edit] Чтобы очистить путаницу, да, блок catch ничего не делает, кроме повторного выброса исключения. Мне было интересно, вызвало ли это какой-то другой порядок в том случае, когда вызывается блок finally (предположим, что вызванное исключение поймано вызывающим), но из того, что я делаю из ответов, это не так.

Ответ 1

Хотя оба исходных кода представляют одну и ту же последовательность выполнения, они приведут к другому байт-коду. Первая процедура будет иметь таблицу исключений, например, тогда как вторая не будет. Их байт-код будет иметь тот же эффект во время исполнения, в отсутствие инструментария. Возможно, что эти методы ведут себя по-разному, если байт-код инструментализован после компиляции или если пойманное исключение относится к типу, файл класса которого недоступен во время выполнения.

Ответ 2

Они одинаковы. Я бы использовал вторую версию.

Ответ 3

Да. Поскольку ваш метод уже выбрасывает "Исключение", вам не нужно его ловить и повторно бросать. Если вы не хотите делать то, что упоминал @Dave.

Ответ 4

Как вы бросаете исключение, которое вы попали в предложение catch, и ничего не делаете, кроме его повторного запуска, да, оба кода будут делать то же самое.

Ответ 5

Вы правы, это то же самое. Даже stacktrace будет там:)

Но аналогичный код может быть использован, если вы завершите исключение на более высокий уровень. Если код выглядит точно так, как указано, это действительно бессмысленно.