Завершит ли блок выполнить? если я пройду через выход;
procedure someProc;
begin
Try
Exit;
finally
do_something;
end;
end;
Завершит ли блок выполнить? если я пройду через выход;
procedure someProc;
begin
Try
Exit;
finally
do_something;
end;
end;
Да, блоки finally
всегда выполняются, даже если вы вызываете Exit
где-то. Они не стоили бы многого, если бы они не всегда исполнялись.
Предложение finally всегда будет выполняться, если исполняемый поток не входит в цикл без конца, блокирует неопределенно или прерывается ненормально, выполняя предложение try.
В соответствующей документации указано (основное внимание):
Синтаксис инструкции try... finally
try statementList1 finally statementList2 end
где каждый statementList представляет собой последовательность операторов разделенных точками с запятой.
Выполняется оператор try... finally операторы в statementList1 (предложение try). Если statementList1 заканчивается без привлечения исключений, statementList2 (условие finally) выполняется. Если во время выполнения statementList1 возникает исключение, управление передается в statementList2; после утверждения statementList2 завершает выполнение, исключение повторно воссоздается. Если вызов Процедура "Выход", "Перерыв" или "Продолжить" приводит к тому, что контроль остается statementList1, statementList2 автоматически выполняется.Таким образом, предложение finally всегда выполняется независимо от того, как прекращается предложение try.
Быстрое тестовое приложение могло бы быстро ответить на этот вопрос.
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.
Для полноты - окончательный блок будет не выполняться, если процесс или поток, выполняющий блок try..finally, завершается с помощью TerminateProcess/TerminateThread.
Например, блок finally не будет выполнен в коде ниже.
o := TObject.Create;
try
TerminateThread(GetCurrentThread, 0);
finally
o.Free;
end;