Я не знаю белка, но даже в отсутствие блока finally вы могли бы до некоторой степени смоделировать поведение в Java:
Exception error = null;
try {
// do something
}
catch (Exception e) {
error = e;
}
// My finally code goes here
// ...
if (error != null) {
// Oh dear clean up all my resources - files, windows, sockets etc.
throw error;
}
Таким образом, блок catch хранит исключение в переменной, которую вы можете проверить позже, если хотите сбросить ее, и это все еще дает вам возможность выполнить другую очистку. Очевидно, что есть нюансы, о которых вы должны знать (например, явные виды исключений, которые требуют особой обработки, большее количество исключений выдается за пределами try / catch), но при тщательном рассмотрении вы должны быть в порядке.
Системные ресурсы (такие как графические дескрипторы, сокеты, окна, файловые дескрипторы и т. Д.), В частности, в Java и других языках с мусором, как правило, немного запутаны. Обычно этими ресурсами управляет класс с явным методом close (). Поэтому, если вы знаете, что вещи попали в кучу, вы обычно вызываете явный close () для объектов, чтобы сразу их очистить. В противном случае объект будет очищаться во время завершения, но только во время GC, который может продолжаться долго.