2011-08-25 11 views
6

So che questo è stato discusso anche su altri argomenti, quello che sto chiedendo è esattamente il titolo di questa domanda.Delphi - try finally block è garantito dal compilatore per essere eseguito correttamente?

C'è un tale caso quando try/finally finalmente non verrà eseguito?

try 
    //some error here 
finally 
    //code that MUST be executed 
end; 

Non sto parlando di come try..except/fine devono essere utilizzati blocchi, sto solo chiedendo se questo possa accadere.

LE: Applicazione.Terminare/scollegare il computer in casi particolari.

+2

Il compilatore non offre alcuna garanzia oltre la fine del mondo o del PC. Qualunque cosa venga prima. Ma in tutti i casi in cui è importante, cioè quando un blocco finally può ancora fare qualcosa di utile, verrà eseguito. –

+1

stavo guardando questa domanda http://stackoverflow.com/questions/3484353/is-there-such-case-when-in-try-finally-block-the-finally-wont-be-executed - sembra che Gli sviluppatori Java non pensano ai wormhole/alla fine del mondo/ecc. Devo ammettere che gli sviluppatori Delphi hanno il senso dell'umorismo – RBA

+0

non in Win64 anche se –

risposta

22

try..finally garantisce che il codice nel blocco finally verrà eseguito indipendentemente da qualsiasi eccezione presente nel blocco protetto. Questo ovviamente non si applica se il processo viene ucciso prima che il blocco finally possa essere eseguito, ad es. da TerminateProcess o spegnendo l'alimentazione. Un ciclo infinito nel blocco protetto può anche impedire l'esecuzione definitiva del blocco.

+11

+1 per ciclo infinito. –

+0

+1 per ciclo anche. –

+15

Un getcha correlato è che non TUTTO il codice in infine è garantito. per esempio, potresti avere 3 affermazioni nella sezione finale, e esplodi la seconda. La terza dichiarazione non verrà eseguita. Un buon esempio proverebbe a liberare oggetti che non sono stati assegnati. –

4

Se l'alimentazione viene persa (ad esempio, se si scollega il computer e non ha batteria e non è collegato a un UPS), è molto probabile che il blocco finally non venga eseguito. Anche un grave malfunzionamento del sistema operativo o del driver (come un BSOD) potrebbe causare questo. Tuttavia, l'intera idea con il costrutto try..finally è che il blocco finally deve essere eseguito anche se viene sollevata un'eccezione (di qualsiasi tipo) all'interno del blocco try. Il blocco finally verrà eseguito anche se è presente un'istruzione exit all'interno del blocco try.

+0

+1 per la risposta. ma è garantito dal compilatore? – RBA

+3

@ RBA: Cosa, scemo? Il compilatore non può garantire che il computer host (hardware/OS/driver) funzioni correttamente ... Tuttavia, io * do * credo che tu sia 'garantito' che il blocco 'finally' venga eseguito se un solito' raise ESomeException.Create (...) 'viene colpito all'interno di' try' (e non succede nient'altro, come se il computer fosse risucchiato in un buco nero o qualcosa del genere). –

+2

+1. Darei un altro +1 per il riferimento "buco nero". se potessi. :) –

3

Se la tua app causa un'eccezione DEP (Data Execution Prevention), non credo che Windows ti permetta di continuare. Il tuo processo verrà colpito, senza eseguire la sezione finale. Il tuo processo "va via". Tuttavia, questo non ha nulla a che fare con ciò che il compilatore ha fatto o non ha fatto.

1

Dopo aver inserito try/finally, il blocco finally verrà eseguito prima che l'esecuzione lasci il try/finally.

+0

Il blocco finally eseguirà _start_. Spero solo che non getti nulla dentro il blocco. –

+0

@henk chi scrive codice che getta in un blocco finale? –

+0

ti piacerebbe comprarli tutti una birra? –

Problemi correlati