Penso che willcode si avvicini di più a esprimere il punto chiave qui, e probabilmente tutti lo intendono ma non sono chiari.
Il problema è che c'è davvero qualcosa di molto sbagliato in quello che stai chiedendo: "Se scrivo tutte le istruzioni dopo il blocco catch invece di scriverle in un blocco finale, allora ci sarebbe qualcosa di sbagliato?"
Se si scrivono tutte le dichiarazioni dopo il blocco catch, ciò che si sta insinuando è che
1) Sarete sempre intercettare l'eccezione.
2) Sarete sempre continuare con la successivi bilanci dopo si cattura l'eccezione.
Ciò implica che vi sarà sempre continuare l'esecuzione "normalmente" dopo un'eccezione, che è generalmente qualcosa che si mai in realtà vogliono fare.
Le eccezioni dovrebbero essere proprio questo: eccezionale. Se in effetti è possibile gestire un'eccezione, è sempre preferibile scrivere il codice per considerare prima tali condizioni e non generare affatto un'eccezione. Se segui questo modello, le eccezioni sono davvero eccezionali, condizioni che non potevi prevedere o al massimo non risolvere. Davvero non è previsto ciò a cui dovresti lavorare. Ciò significa che in generale non è possibile gestire le eccezioni true, il che significa anche che non si deve solo continuare l'esecuzione, spesso si termina l'applicazione.
Ciò che viene normalmente fatto è consentire a un errore di propagare il backup dello stack di chiamate. Alcuni dicono che questo è fatto nella remota possibilità che qualcuno più in alto nella catena possa essere in grado di gestirlo. Direi che essenzialmente non succede mai, ci sono due veri scopi per farlo. Uno può essere qualcosa che l'utente può correggere, se ce n'è uno. Quindi si propagherà l'errore di backup fino a quando non si arriva a dove è possibile segnalarlo all'utente. O due, un utente non può aggiustarlo ma si desidera ottenere l'intero stack di chiamate per il debug. Poi lo prendi in alto per fallire con grazia.
Il blocco finale ora dovrebbe avere più significato per voi. Come dicono tutti, corre sempre. L'uso più chiaro di un finalmente è davvero in un tentativo ... finalmente blocco. Quello che stai dicendo ora è se il codice funziona bene, ottimo. Dobbiamo ancora fare un po 'di pulizia e alla fine eseguiamo sempre, poi procediamo. Ma se si verifica un'eccezione, ora abbiamo davvero bisogno di un blocco definitivo perché potremmo ancora aver bisogno di fare un po 'di pulizia, ma qui non stiamo più rilevando l'eccezione, quindi non avremo più intenzione di andare avanti. Il blocco finale è essenziale per garantire che si verifichi la pulizia.
L'idea di un'eccezione che interrompe sempre l'esecuzione può essere difficile da afferrare fino a quando non hanno una certa esperienza, ma in realtà è il modo di fare sempre le cose. Se si è verificato un errore, o è stato così piccolo che dovresti averlo considerato all'inizio, oppure ci sono sempre più errori in attesa di accadere lungo la linea.
Errori di "deglutizione": catturarli e andare avanti è la cosa peggiore che puoi fare perché il tuo programma diventa imprevedibile e non riesci a trovare e correggere bug.
Il codice ben scritto conterrà altrettanti tentativi ... infine i blocchi necessari per garantire che le risorse vengano sempre rilasciate indipendentemente dal risultato. Ma il codice ben scritto in genere contiene solo un piccolo numero di try ... cattura i blocchi che esistono principalmente per consentire a un'applicazione di fallire nel modo più aggraziato possibile, o rimandare all'utente, il che significa che almeno passa sempre un messaggio all'utente, ecc. Ma di solito non prendi semplicemente un errore e vai avanti.
Questa domanda ha avuto risposta prima di http://stackoverflow.com/questions/3354823/how-to-use-finally. Quindi è un duplicato –
[Il codice in un blocco finally è garantito per l'esecuzione! Sempre! Nessuna eccezione!] (Http://thedailywtf.com/Articles/My-Tales.aspx) – badp
@Shervin, hai letto entrambe le domande prima di contrassegnarlo come duplicato –