Исключение в блоке наконец

Если исключение возникает в блоке finally, выполняется ли остаток блока finally или нет?

try
  statementList1
finally
  command;
  command_that_raises;
  critical_command;
end

Будет critical_command быть казненным?

Руководство говорит только об исключениях, а не о выполнении кода:

Если исключение возникает, но не обрабатывается в предложении finally, это исключение распространяется из оператора try...finally, и любое исключение, уже созданное в предложении try, теряется. Следовательно, предложение finally должно обрабатывать все локально возникающие исключения, чтобы не мешать распространению других исключений.

1 ответ

Решение

Смотрите следующее подтверждение

procedure TForm6.Button1Click(Sender: TObject);
begin

  try
    showmessage('begin');
  finally
    showmessage('enter');
    raise Exception.Create('raise');
    showmessage('end');
  end;

end;

А теперь для этого случая

procedure RaiseAndContinue;
begin
  try
    raise Exception.Create('raise');
  except

  end;
end;

procedure TForm6.Button1Click(Sender: TObject);
begin

  try
    showmessage('begin');
  finally
    showmessage('enter');
    RaiseAndContinue;
    showmessage('end');
  end;

end;

Короткий ответ, если вы не обработаете это исключение, тогда код не будет выполнен.

Другие вопросы по тегам