Поведение Finally ("выходя")

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 2873
Зарегистрирован: 07.10.18 14:01

Поведение Finally ("выходя")

Сообщение БудДен » 17.01.24 23:55

В ЯОС под Linux внезапно обнаружилось, что блоки finally работает не совсем привычно. А именно, они сбрасывают исключение. Чтобы исключение "пошло дальше", как это бывает в привычных языках типа java, C++, Delphi, нужно его в явном виде породить заново, например, поставить HALT внутри блока Finally Судя по коду, который я увидел в FoxAMDBackend...ProcessIntermediateCodeModule, а также в других случаях, где используется Finally, данное поведение является тем, как и было задумано. Задал вопрос в телеграм-чате A2, жду ответа (но может быть и забанят, хаха).

И ещё одна странная вещь - когда в коде написано RETURN TRUE, а в блоке FINALLY - RETURN FALSE. Это пока не укладывается в моей голове.

БудДен
Сообщения: 2873
Зарегистрирован: 07.10.18 14:01

Re: Поведение Finally ("выходя")

Сообщение БудДен » 18.01.24 00:19

Видимо, это так и есть, вот тестовый модуль:

Код: Выделить всё

модуль Проба; 

(* Проба.Дей  ~ *)

проц Дей*();
нач
	трассируй("вход в Дей");
	Дей1();
	трассируй("вернулись из Дей1") кон Дей;
	
проц Дей1();
перем успех: булево;
нач
	трассируй("вход в Дей1");
	Дей2();
	трассируй("после СТОП (не должны сюда попасть)");
	успех := истина;
выходя
	трассируй("выходя из Дей1");
	если ~ успех то
		СТОП(50) всё кон Дей1;


проц Дей2();
перем успех: булево;
нач
	трассируй("вход в Дей2");
	СТОП(50);
	трассируй("в Дей2 после СТОП (не должны сюда попасть)");
	успех := истина;
выходя
	трассируй("выходя из Дей2");
	если ~успех то 
		СТОП(50) всё кон Дей2;
кон Проба.
Если убрать СТОП(50) из блоков "выходя", то они пожирают исключение и выполнение продолжается дальше. Судя по коду A2, это так и задумано. Поправил описание языка. Похоже, что это такая вот изюминка языка. Golang с его паникой и recover сделал по-другому, чем обычно, а тут ещё третий вариант.

БудДен
Сообщения: 2873
Зарегистрирован: 07.10.18 14:01

Re: Поведение Finally ("выходя")

Сообщение БудДен » 18.01.24 00:24

Здесь, правда, вызывает сомнение то, что никакой информации о природе исключения программе недоступно. Поэтому и обработать по существу это исключение нельзя - можно лишь на основании анализа состояния переменных принять какое-то решение - породить исключение заново (с уже другим кодом, поскольку исходный код исключения недоступен), либо не порождать. При том и сам код ошибки нигде не доступен коду программы - он только печатается для пользователя. Это выглядит несколько странно, и пока непонятно, как с этим обходиться. Возможно, здесь есть какая-то светлая мысль, до которой я пока не додумался.

Ответить