В ЯОС под Linux внезапно обнаружилось, что блоки finally работает не совсем привычно. А именно, они сбрасывают исключение. Чтобы исключение "пошло дальше", как это бывает в привычных языках типа java, C++, Delphi, нужно его в явном виде породить заново, например, поставить HALT внутри блока Finally Судя по коду, который я увидел в FoxAMDBackend...ProcessIntermediateCodeModule, а также в других случаях, где используется Finally, данное поведение является тем, как и было задумано. Задал вопрос в телеграм-чате A2, жду ответа (но может быть и забанят, хаха).
И ещё одна странная вещь - когда в коде написано RETURN TRUE, а в блоке FINALLY - RETURN FALSE. Это пока не укладывается в моей голове.
Поведение Finally ("выходя")
Re: Поведение Finally ("выходя")
Видимо, это так и есть, вот тестовый модуль:
Если убрать СТОП(50) из блоков "выходя", то они пожирают исключение и выполнение продолжается дальше. Судя по коду A2, это так и задумано. Поправил описание языка. Похоже, что это такая вот изюминка языка. Golang с его паникой и recover сделал по-другому, чем обычно, а тут ещё третий вариант.
Код: Выделить всё
модуль Проба;
(* Проба.Дей ~ *)
проц Дей*();
нач
трассируй("вход в Дей");
Дей1();
трассируй("вернулись из Дей1") кон Дей;
проц Дей1();
перем успех: булево;
нач
трассируй("вход в Дей1");
Дей2();
трассируй("после СТОП (не должны сюда попасть)");
успех := истина;
выходя
трассируй("выходя из Дей1");
если ~ успех то
СТОП(50) всё кон Дей1;
проц Дей2();
перем успех: булево;
нач
трассируй("вход в Дей2");
СТОП(50);
трассируй("в Дей2 после СТОП (не должны сюда попасть)");
успех := истина;
выходя
трассируй("выходя из Дей2");
если ~успех то
СТОП(50) всё кон Дей2;
кон Проба.
Re: Поведение Finally ("выходя")
Здесь, правда, вызывает сомнение то, что никакой информации о природе исключения программе недоступно. Поэтому и обработать по существу это исключение нельзя - можно лишь на основании анализа состояния переменных принять какое-то решение - породить исключение заново (с уже другим кодом, поскольку исходный код исключения недоступен), либо не порождать. При том и сам код ошибки нигде не доступен коду программы - он только печатается для пользователя. Это выглядит несколько странно, и пока непонятно, как с этим обходиться. Возможно, здесь есть какая-то светлая мысль, до которой я пока не додумался.