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.