Интересно, являются ли следующие два swnippest семантически идентичными и, если нет, каковы различия (мы предполагаем, что мы хотим вычислить результат типа R и хотим защитить от исключения X, которое может быть выбрано в ход этого):
public R tcf(....) {
try {
R some = ...;
... compute the result ....
return some;
}
catch (X exception) {
... exception handling ....
}
finally {
... clean up ....
}
}
и следующее:
public R tc(....) {
try {
R some = ...;
... compute the result ....
return some;
}
catch (X exception) {
... exception handling ....
}
}
public R tf(....) {
try {
return tc(....); // wrap the try-catch in tc()
}
finally {
... clean up ....
}
}
Насколько я могу судить, это сводится к тому, что блок try-catch, завернутый в блок try, наконец, является тем же, семантически, как блок try-catch-finally, предполагая, что код в конце и фразы catch остаются одинаковыми, а внешний блок try просто способствует результату внутреннего.
Практическая значимость: учитывая базовую базу кода, которая не использует try-catch, наконец, когда это необходимо, и учитывая, что по какой-то причине невозможно обработать этот код, можно более или менее механически создать слой обертки методы, которые добавляют окончательно.
Я полностью осознаю тот факт, что по многим причинам следует использовать try... catch... наконец, когда это возможно. В частности, я не, предлагая в любом случае, что нужно рефакторировать первый пример, чтобы он выглядел как второй.
Скорее, я хочу убедиться, что пример 2 можно безопасно реорганизовать в пример 1.