tutorial tag qué manager instalar gtm gtag google fragmento contenedor como delphi try-finally

delphi - tag - ¿Las declaraciones en el bloque Finalmente todavía se ejecutan en este fragmento de código?



qué es el fragmento del contenedor en google tag manager (4)

¿Finalmente se ejecutará el bloqueo? si paso la salida; ?

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


En aras de la integridad, finalmente el bloque no se ejecutará si el proceso o el subproceso que ejecuta el bloque try..finally finaliza con TerminateProcess / TerminateThread.

Por ejemplo, finalmente el bloque no se ejecutará en el código siguiente.

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


La cláusula finally siempre se ejecutará, a menos que el subproceso en ejecución ingrese en un bucle que no termina, se bloquee indefinidamente o se termine de manera anormal, mientras se ejecuta la cláusula try.

La documentation pertinente establece (énfasis mío):

La sintaxis de un intento ... finalmente es una declaración

try statementList1 finally statementList2 end

donde cada lista de instrucciones es una secuencia de instrucciones delimitadas por punto y coma.

La sentencia try ... finally ejecuta las sentencias en statementList1 (la cláusula try). Si statementList1 finaliza sin generar excepciones, se ejecuta statementList2 (la cláusula finally). Si se genera una excepción durante la ejecución de statementList1, el control se transfiere a statementList2; Una vez que statementList2 termina de ejecutarse, la excepción se vuelve a elevar. Si una llamada al procedimiento Salir, Interrumpir o Continuar hace que el control salga de statementList1, se ejecuta automáticamente statementList2. Por lo tanto, la cláusula finally siempre se ejecuta, independientemente de cómo termine la cláusula try.


Sí, finally bloques siempre se ejecutan, incluso si se llama Exit algún lugar. No valdrían mucho si no siempre fueran ejecutados.


Una aplicación de prueba rápida podría haber respondido esta pregunta muy rápidamente.

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.