Ошибки выполнения

Отдельного рассмотрения заслуживают средства восстановления после различного рода сбоев и аварийных ситуаций.

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

Однако такое взаимодействие с отладчиком не позволяет прервать зациклившуюся задачу TехноCи по инициативе оператора. Прерывание задачи выполняется интерпретатором автоматически следующим образом: после выполнения очередных 1000 базовых конструкций интерпретатора (эти конструкции являются некоторым аналогом команд языка Ассемблера, в которые компилируется исходная программа на TехноCи) анализируется общее время выполнения текущего цикла программы. И если это время в 5 раз превысило значение параметра INTERVAL, заданного в директиве #PRAGMA, задача снимается с выполнения с выдачей соответствующего сообщения.

Другая ситуация, связанная с переполнением стека задачи, также обнаруживается автоматически, и задача снимается с выполнения с выдачей соответствующего сообщения.

По мере увеличения размеров программ и интенсивности использования библиотек, становится важной стандартизация обработки ошибок. Чтобы программа обработки ошибок не выполнялась до тех пор, пока не возникнет соответствующая ошибочная ситуация, язык ТехноСи обеспечивает встроенный стандартный механизм обработки ошибок с помощью операторов try, catch и trow, называемый обработкой исключительных ситуаций. Благодаря обработке исключительных ситуаций можно упростить управление и реакцию на ошибки во время выполнения программ.

Стандартное сообщение о возникновении исключительной ситуации выводится всегда, независимо от того, перехвачена исключительная ситуация или нет.

По запросу отладчику в окне ошибок периода выполнения можно выполнить просмотр всех сообщений об ошибках, возникших в ходе выполнения данной отлаживаемой задачи в контроллере управления.

При нажатии на клавишу F10 или щелчке левой кнопкой мыши на области экрана, относящейся к подсказке функциональной клавиши F10 (10 МЕНЮ), осуществляется вызов меню дополнительных операций.

В результате выбора из меню строки ОШИБКИ ВЫПОЛНЕНИЯ будет выполнена операция вывода списка сообщений об ошибках в ходе выполнения задачи. Окно вывода сообщений об ошибках периода выполнения задачи имеет формат, представленный на рисунках 113 и 114.

Рисунок 113
Рисунок 114
Рисунок 115

Если дата и время какого-то сообщения об ошибке периода выполнения будет начинаться символом ‘?’ (рисунок 114), то это означает принадлежность данного сообщения не к текущему выполнению программы, а к одному из ее предыдущих вариантов, которые подверглись редактированию.

В этом окне содержится информация обо всех обнаруженных ошибках в процессе выполнения данной программы (деление на 0, выход за пределы массива и т.д.), например как на рисунке 114.

Обнаруженные в процессе выполнения данной программы ошибки также фиксируются в окне вывода технологических сообщений (рисунок 115). Если в программе имеется вывод технологических сообщений, то в процессе работы задачи эти сообщения заменят собой сообщения об ошибочных ситуациях, в окне же ошибок периода выполнения будут всегда выведены все на данный момент времени зафиксированные ошибочные ситуации.

Cообщения об ошибочных ситуациях

Текст сообщения
Причина ошибки
1
ДЕЛЕНИЕ НА НОЛЬ Программа выполнила операцию деления на ноль, операция деления игнорируется. Секция будет отключена, если исключительная ситуация не будет перехвачена. В противном случае возбуждается
обработка исключительной ситуации с типом EDivIntZero или EDivFltZero соответственно.
2
НАРУШЕНЫ ГРАНИЦЫ МАССИВА Индекс массива превышает его размерность или задан отрицательным значением, операция игнорируется. Секция будет отключена, если исключительная ситуация не будет перехвачена. В противном случае возбуждается
обработка исключительной ситуации с типом EIndex.
3
УСЕЧЕНИЕ СТРОКИ ПРИ ПРИСВАИВАНИИ При выполнении присваивания символьному массиву или переменной типа string присваиваемое символьное значение не помещается в переменной, операция игнорируется. Секция не будет отключена, если исключительная ситуация не перехвачена. В противном случае возбуждается обработка исключительной ситуации с типом EOverStr.
4
INTEGER OVERFLOW Программа выполнила операцию присваивания целого значения переменной типа char или int вне доступного диапазона значений (-128, +127 для типа char и -32768, +32767 для типа int), операция игнорируется. Секция не будет отключена, если исключительная ситуация не перехвачена. В противном случае возбуждается
обработка исключительной ситуации с типом EOverInt.
5
FLOAT OVERFLOW Программа выполнила операцию с плавающей точкой, которая привела к переполнению диапазона плавающего числа, операция игнорируется. Секция не будет отключена, если исключительная ситуация не перехвачена. В противном случае возбуждается обработка исключительной ситуации с типом EOverFlt.
6
ПЕРЕПОЛНЕНИЕ СТЕКА В процессе работы секции программы для локальных переменных недостаточно выделенной памяти стека, осуществляется автоматическое отключение секции.
7
ЗАЦИКЛИВАНИЕ ЗАДАЧИ Длительность выполнения программы превысила пятикратный размер интервала ее запуска , осуществляется автоматическое отключение секции. Секция будет отключена, если исключительная ситуация не будет перехвачена. В противном случае возбуждается обработка исключительной ситуации с типом ELoop.
8
СИТУАЦИЯ TRY CATCH Ошибка в работе интерпретатора, осуществляется автоматическое отключение секции.

В случае автоматического отключения секции выводится следующее сообщение:

СЕКЦИЯ <имя секции> ОТКЛЮЧЕНА

Включение секции может быть произведено после перезагрузки программы или в процессе работы с помощью отладчика.