13 · Обработка ошибок
Оператор ERROR
Прикладное условие не всегда совпадает с возможностями операции: данные могут оказаться неполными, состояние — неподходящим. Когда продолжать нельзя, программа сама создаёт отказ оператором ERROR и задаёт ему собственный код, а обработчик получает этот отказ наравне с системными ошибками. Той же формой со значением ERROR можно передать уже полученную ошибку наружу.
Где применим оператор
ERROR доступен на верхнем уровне и в подпрограммах. Созданные им отказы обрабатываются тем же TRY, что и системные, поэтому обработчику не нужно различать их происхождение: он читает код и сообщение из переменной CATCH.
Формы записи
Формы различаются тем, создаётся новый отказ или передаётся существующий, и тем, задан ли текст сообщения.
Ошибка с кодом:
ERROR <код>Ошибка с кодом и сообщением:
ERROR <код>, <сообщение>Повторная передача полученной ошибки:
ERROR <значение ошибки>Аргументы
Код имеет тип STRING и обозначает прикладной код ошибки. Он не должен быть пустым или состоять только из пробелов; другие непустые строки разрешены. Сообщение также имеет тип STRING и становится текстом ошибки, включая допустимую пустую строку.
Значение ошибки имеет встроенный тип ERROR; обычно это переменная, объявленная в CATCH. Повторная передача сохраняет Code, Message, Line и Column исходной ошибки.
Действие и ограничения
Форма с одним кодом создаёт английское сообщение User error <код>. независимо от языка интерфейса IDE. Явно заданное сообщение сохраняется без перевода, включая русские символы и пустую строку; правило действует и при коде, совпадающем с системным: ERROR "MB3007", "Моя ошибка" сохраняет текст «Моя ошибка». Созданная ошибка получает место текущего оператора. Оставшиеся инструкции текущего защищённого участка не выполняются, а управление передаётся ближайшему подходящему CATCH. Без обработчика запуск завершается неуспешно.
Программа ниже создаёт отказ внутри TRY и читает его сведения в обработчике:
TRY
ERROR "APP001", "Нет данных"
CATCH err
PRINT err.Code
PRINT err.Message
END TRY
PRINT "after"Ожидаемый вывод:
APP001
Нет данных
afterКод APP001 и текст «Нет данных» дошли до обработчика без изменений, потому что явно заданное сообщение не переводится. Инструкций после ERROR в защищённом участке нет, поэтому сразу выполнился обработчик, а затем работа продолжилась за END TRY.
Диагностика
MB2003 означает нестрочный код или сообщение либо неподходящее значение для повторной передачи. MB3007 возникает для пустого кода или кода из одних пробелов. Код созданной неперехваченной ошибки равен переданной строке.