Обработка сигналов отказа процедуры/функцииСигналы отказа процедуры/функции в
PureBuilder являются переменными логического типа и заменяют собой исключения и функции Assert и Exit в языках программирования, а также создаваемые программистом коды ошибок.
В
вызывающей процедуре/функции программист может произвольным образом (обычно в условных операторах, в том числе вложенных, и даже в заголовках циклов) использовать сигналы отказа, которые считаются автоматически объявленными и имеют идентификатор вида:
- имя_вызываемой_процедуры.имя_сигнала_отказа,
- имя_вызываемой_процедуры.имя_прерывания_операционной_системы,
- имя_вызываемой_процедуры.failure (для любого сигнала отказа или реально возможного прерывания операционной системы).
Необходимо автоматически информировать программиста, какие из сигналов отказа, могущих возникнуть в вызываемой процедуре/функции, учтены в вызывающей процедуре/функции. Для этого около идентификатора процедуры/функции должна появляться всплывающая табличка со всеми возможными сигналами отказа (включая реально возможные прерывания операционной системы) и обозначениями действий ("не учтено", "учтено", "игнорировать") напротив них. Идентификаторы процедур/функций, имеющих хотя бы один неучтенный сигнал отказа, должны автоматически помечаться.
В
вызываемой процедуре/функции сигналы отказа используются один раз – только в качестве параметра в операторе Escape() – и без указания имени вызываемой процедуры. Они не могут каким-либо ещё образом использоваться в вызываемой процедуре.
Как и оператор Exit в языках программирования, оператор Escape():
- чаще всего используется в условном операторе;
- прерывает исполнение процедуры/функции, в которой он встречается.
Но, в отличие от оператора Exit (отсутствующего в PureBuilder), оператор Escape():
- объявляет сигнал отказа – переменную логического типа – и присваивает ей значение «истина»,
- объявляет все данные из вызываемой процедуры скомпрометированными и делает их недоступными в вызывающей процедуре. Не происходит возврата параметров или возвращаемого значения в вызывающую функцию/процедуру. Поэтому сигналы отказа невозможно использовать для моделирования нормальной логики (нарушая при этом принципы структурного программирования), а можно использовать только для случаев аварийного завершения вызываемой процедур.
Опасные операторы и части программы, которые могут вызвать прерывания операционной системы (ошибка выделения памяти, ошибка оператора присваивания или ввода/вывода, деление на ноль, выход индекса за границу массива и т.д.) или иные сигналы отказа, следует выделять в отдельные процедуры/функции по следующим причинам:
- для облегчения обработки прерываний операционной системы с помощью перехвата сигналов отказа,
- для сохранения возможности воспользоваться выходными параметрами или возвращаемым значением в случае отказа опасной части программы.
Сигналы отказа также автоматически генерируются, если входные или выходные параметры, возвращаемое значение и локальные переменные функции/процедуры не соответствуют ограничениям, заданным при их объявлении. Имена сигналов отказа вносятся программистом в таблицу объявлений. Соответствующие проверки осуществляются при вызове и при завершении функции/процедуры.
Сигналы отказа записываются в специальный стандартный журнал (аналог "черного ящика" самолета). Не всегда последствия ошибок времени исполнения можно предотвратить, но можно будет хотя бы сделать какие-то выводы.