2011-12-23 12 views
17

Alla fine si bloccherà l'esecuzione? se passo l'uscita; ?Le istruzioni nel blocco Finally vengono ancora eseguite in questo pezzo di codice?

procedure someProc; 
begin 
    Try 
     Exit; 
    finally 
    do_something; 
    end; 
end; 
+2

Nota a margine: 'while True fare provare uscita; infine Continua; fine; 'non verrà compilato - vedi [Divertimento con loop infiniti in Delphi e Java] (http://mikejustin.wordpress.com/2008/07/13/fun-with-infinite-loops-in-delphi-and- java /) – mjn

risposta

24

Sì, finally blocchi eseguire sempre, anche se si chiama Exit da qualche parte. Non varrebbero molto se non fossero sempre eseguiti.

10

Un'app di prova rapida avrebbe potuto rispondere a questa domanda molto rapidamente.

program TestFinally; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

begin 
    try 
    WriteLn('Before exiting'); 
    Exit; 
    finally 
    WriteLine('In finally. If you see this, it was written after "Exit" was called'); 
    ReadLn; 
    end; 
end. 
21

L'infine viene sempre eseguito clausola, a meno che il filo di esecuzione entra in un ciclo non fatale, blocchi indefinitamente o è terminata in modo anomalo, mentre l'esecuzione della clausola try.

Le pertinenti documentation stati (sottolineatura mia):

La sintassi di un try ... finally è

try 
    statementList1 
finally 
    statementList2 
end 

dove ogni StatementList è una sequenza di istruzioni delimitato da punti e virgola.

L'istruzione try ... finally esegue le istruzioni in statementList1 (la clausola try). Se statementList1 termina senza generare eccezioni, viene eseguito statementList2 (la clausola finally). Se viene sollevata un'eccezione durante l'esecuzione di statementList1, il controllo viene trasferito a statementList2; una volta che statementList2 termina l'esecuzione, l'eccezione viene controrilanciata. Se una chiamata alla procedura Exit, Break o Continue fa sì che il controllo lasci statementList1, statementList2 viene eseguito automaticamente. Quindi la clausola finally viene sempre eseguita, indipendentemente da come termina la clausola try.

+0

+1 per elencare quelle condizioni quando la clausola finally non viene eseguita. –

+0

Ti sei perso 'Halt'. –

+0

@MrLister No, non l'ho fatto. Leggi di nuovo il primo paragrafo. –

6

Per ragioni di completezza - finally sarà non eseguire se il processo o thread esecuzione del blocco try..finally è terminato con TerminateProcess/TerminateThread.

Ad esempio, il blocco finale non verrà eseguito nel codice riportato di seguito.

o := TObject.Create; 
try 
    TerminateThread(GetCurrentThread, 0); 
finally 
    o.Free; 
end; 
+0

Mi è mancato nella mia risposta? Forse avrei dovuto dire terminare * thread * in modo anormale piuttosto che programmare. –

+0

Hai ragione, l'hai detto. Sentiti libero di unire il mio esempio alla tua risposta, poi cancellerò il mio. – gabr

+2

Ho modificato il mio testo per renderlo un po 'più completo. La tua risposta copre in modo approfondito quell'aspetto particolare e penso che unire il tuo esempio alla mia risposta ridurrebbe al punto principale che è la citazione della documentazione. Grazie e +1. –