Первый всего лишь идиомы, что даже можно считать кандидата это:
try {
// stuff
} catch (Throwable t) { /* handle */ }
// finally stuff
Примечания пойманного типа. Только если вы поймаете любое возможное исключение, в том числе такие темные монстры, как ThreadDeath
и VirtualMachineError
, можете ли вы надеяться безоговорочно достичь кода под try-catch.
Но, это только там, где оно начинается. Что делать, если сам код обработки вызывает исключение? Так что вам нужно, по крайней мере
try { /* main stuff */ }
catch (Throwable t) {
try { /* handle */ } catch (Throwable t) {
// no code allowed here! Otherwise we descend into infinite recursion
}
}
/* finally stuff */
Теперь вы можете начинают понимать преимущества finally
, но это еще не все. Рассмотрим довольно типичный сценарий:
try {
/* main stuff, may throw an exception. I want the exception to
break what I'm doing here and propagate to the caller */
return true;
} finally { /* clean up, even if about to propagate the exception */ }
Как вы это переписываете? Без дублирования кода невозможно.
Вы можете добавить логику, чтобы закрыть ресурсы в выражении блока 'finally' и получить здесь исключение, поэтому лучшей альтернативой будет последняя (IMO). –
нет разницы в вашем примере. Сделайте некоторую очистку, в конце концов, которая будет выполнена в любом случае. – Tala