Александр Шостак писал(а):
Мой вариант: ...
Плюсы:
+) Сохраняется правило: у блока один вход и один выход, а с ним и все формальные доказательства о свойствах кода.
Разве свойства кода в PureBuilder менее понятны? А вот сигнальные значения функции несут в себе опасности:
- нарушение строгой типизации для возвращаемого значения
- потенциальная возможность возврата сигнального значения в результате нормальной работы функции
- возможная попытка применить сигнальное значение функции в дальнейшей работе алгоритма в качестве нормального результата
Александр Шостак писал(а):
+) Функции унифицированны. Не нужно знать имён исключений или расшифровывать мета-информацию в результатах. TRUE - успех, FALSE - нет.
Аналогичная по функциональности вещь будет в PureBuilder - это универсальный блок
catch exception, который будет работать при любом исключении. Я о нем уже думал раньше, но пока не успел добавить на сайт. Остальные блоки
catch имя исключения программист может не заполнять, если в этом нет необходимости.
Александр Шостак писал(а):
+) Любые естественные логические выражения легко строятся из функций, не возвращающих гарантированно результат (если удалость А и удалось Б или не удалось С, то попробовать Д или Е).
Я за жесткое разделение штатного и аварийного алгоритмов, поэтому мне не нравится такой подход. Но то, что Вы описываете, можно сделать и в PureBuilder, задав необходимые значения флагов в разных блоках
catch.
Александр Шостак писал(а):
Ваш вариант. Конструкция catch относится к вызывающей процедуре.
*) Структурность нарушается лишь частично - на одном уровне.
Я не вижу, чтобы она вообще нарушалась. Блоки
catch выбираются в зависимости от имени исключения - аналогично действию оператора
switch/
case, который самый что ни на есть "структурный".
Александр Шостак писал(а):
?) PureBuilder поддерживает выражения из функций?
Да.
Александр Шостак писал(а):
К какой части выражения тогда относится catch?
К любой, вызвавшей исключение.
Александр Шостак писал(а):
catch может быть применён к целому блоку кода?
Нет. Только к одному оператору присваивания, вызова процедуры, ввода/вывода или размещения в памяти, то есть, к любому оператору, который может непосредственно сгенерировать исключение. Но
catch не может быть применён к условному оператору, оператору цикла и т.п.