Неужели это `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 будет там:)
Но аналогичный код может быть использован, если вы завершите исключение на более высокий уровень. Если код выглядит точно так, как указано, это действительно бессмысленно.