C'è una grande differenza nei due snippet che hai presentato, ad es. quando il blocco catch
genera un'eccezione, il blocco finally
viene comunque eseguito dalla relativa semantica.
che è la seguente stampa frammento "Finally!"
, ma non "What about me???"
:
try {
throw null; // throws NullPointerException!
} catch (Exception e) {
int oops = 1/0; // throws ArithmeticException!
} finally {
System.out.println("Finally!"); // still gets executed!
}
System.out.println("What about me???"); // doesn't get executed!
In generale, il finally
di un blocco try
praticamente sempre Viene eseguito. Non esiste alcuna garanzia per alcun codice successivo al blocco try
.
Ma cosa succede se il mio blocco catch
è solo un semplice print
dichiarazione?
C'è ancora alcuna garanzia che non sarà throw
qualcosa. Qualcosa potrebbe ancora andare storto, ad es. la costruzione per il messaggio dettagliato di eccezione.
Anche se si fa il possibile per garantire che il codice catch
sia "sicuro" e il codice che segue l'istruzione try
verrà sempre eseguito, la domanda diventa "Perché?". Perché evitare lo finally
ma provare così tanto a replicare la sua semantica?
finally
la semantica è garantita, senza alcun onere della prova da parte dello scrittore o del lettore del codice. Proprio per questo, è idiomatico utilizzare il blocco finally
per inserire il codice "clean-up" obbligatorio. L'utilizzo di finally
garantisce la correttezza e migliora sia la leggibilità che la leggibilità.
Nota che raramente è utile avere un 'try' dichiarazione sia con un' catch' e "finalmente" se non vuoi il codice disordinato. –
@ Tom perché? servono 2 scopi completamente diversi, il problema è la gestione del fallimento, infine è per la gestione delle risorse. – james
@james Sì, hanno usi completamente diversi, il che significa che il loro ambito dovrebbe essere in genere diverso. –