First di tutti, l'unico linguaggio che può anche essere considerato un candidato è questo:
try {
// stuff
} catch (Throwable t) { /* handle */ }
// finally stuff
Annotare il tipo di pescato. Solo se rilevi un'eventuale eccezione, compresi mostri oscuri come ThreadDeath
e VirtualMachineError
, puoi sperare di raggiungere incondizionatamente il codice sotto il try-catch.
Ma, questo è solo dove inizia. Cosa succede se il codice di gestione stesso lancia un'eccezione? Quindi è necessario almeno
try { /* main stuff */ }
catch (Throwable t) {
try { /* handle */ } catch (Throwable t) {
// no code allowed here! Otherwise we descend into infinite recursion
}
}
/* finally stuff */
Ora si può essere cominciando a realizzare i benefici di finally
, ma non è tutto. Si consideri uno scenario abbastanza tipico:
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 */ }
Come si riscrive questo? Senza duplicazione del codice, impossibile.
fonte
2013-06-23 15:28:52
È possibile aggiungere la logica per chiudere le risorse nell'istruzione di blocco 'finally' e ottenere un'eccezione qui, quindi l'alternativa migliore sarebbe quest'ultima (IMO). –
nessuna differenza nel tuo esempio. Fai un po 'di pulizia, infine, che verrà eseguito comunque. – Tala