Некорректный Exit в try...finally (FS > 1.3)

отредактировано 06:48 Раздел: FastScript
Вроде я не глазливый;) Проверил в демке 1.3 - работает, в
1.4-1.5 нет 8-( Внутри процедур поведение точно такое же.
begin
  ShowMessage('Start!');
  try
    Exit;
  finally
    ShowMessage('Finally!');
  end;
  ShowMessage('Finish!');
end.

Комментарии

  • отредактировано 06:48
    Нда, последствия введения метода Terminate ;)

    Можно пофиксить самому: убрать в fs_iinterpreter.pas

    procedure TfsStatement.Execute;
    ...
    // if FProgram.FExitCalled then break;

    и ниже, во всех TfsXXXStmt строку

    // if FProgram.FExitCalled then Exit;
  • отредактировано 06:48
    Спасибо!
  • отредактировано 06:48
    1.Уточняю, спасибо за ответ! ;) - т.к. выполняется только 1й оператор после finally:
    begin
      ShowMessage('Start!');
      try
        Exit;
      finally
        ShowMessage('Finally 1!');
        ShowMessage('Finally 2!');
        ShowMessage('Finally 3!');
      end;
      ShowMessage('Finish!');
    end.
    
    Впрочем, 1.3 болел тем же, я не проверил по-боевому - поспешил порадоваться ;)

    2.Сейчас роль initialization в модуле выполняет главный блок (begin...end.), а как насчет реализации секций initialization|finalization в модулях? Иногда они хорошо помогают.
  • отредактировано 06:48
    Тогда так:
    procedure TfsTryStmt.Execute;
    var
      SaveExitCalled: Boolean;
    begin
      RunLine;
      if FProgram.FTerminated then Exit;
      if IsExcept then
      begin
        try
          inherited Execute;
        except
          ExceptStmt.Execute;
        end;
      end
      else
      begin
        try
          inherited Execute;
        finally
          SaveExitCalled := FProgram.FExitCalled;
          FProgram.FExitCalled := False;
          ExceptStmt.Execute;
          FProgram.FExitCalled := SaveExitCalled;
        end
      end;
    end;
    

    2) пока не планируется.
  • отредактировано 06:48
    Спасибо, но:
    FProgram.FTerminated ?
    Смысл понятен, но не посягать же на исходники ;)
  • отредактировано 06:48
    Пока эту строку можно пропустить ;)
  • отредактировано 06:48
    Спасибо, я проинтуичил ;)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.