Подтвердить что ты не робот

Операции в блоке finally все еще выполняются в этом фрагменте кода?

Завершит ли блок выполнить? если я пройду через выход;

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

Ответ 1

Да, блоки finally всегда выполняются, даже если вы вызываете Exit где-то. Они не стоили бы многого, если бы они не всегда исполнялись.

Ответ 2

Предложение finally всегда будет выполняться, если исполняемый поток не входит в цикл без конца, блокирует неопределенно или прерывается ненормально, выполняя предложение try.

В соответствующей документации указано (основное внимание):

Синтаксис инструкции try... finally

try 
  statementList1
finally
  statementList2 
end 

где каждый statementList представляет собой последовательность операторов разделенных точками с запятой.

Выполняется оператор try... finally операторы в statementList1 (предложение try). Если statementList1 заканчивается без привлечения исключений, statementList2 (условие finally) выполняется. Если во время выполнения statementList1 возникает исключение, управление передается в statementList2; после утверждения statementList2 завершает выполнение, исключение повторно воссоздается. Если вызов Процедура "Выход", "Перерыв" или "Продолжить" приводит к тому, что контроль остается statementList1, statementList2 автоматически выполняется.Таким образом, предложение finally всегда выполняется независимо от того, как прекращается предложение try.

Ответ 3

Быстрое тестовое приложение могло бы быстро ответить на этот вопрос.

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.

Ответ 4

Для полноты - окончательный блок будет не выполняться, если процесс или поток, выполняющий блок try..finally, завершается с помощью TerminateProcess/TerminateThread.

Например, блок finally не будет выполнен в коде ниже.

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