Существует несколько различных ситуаций для обработки ошибок, с которыми встречаются при программировании OpenDCL: обработка стандартных ошибок AutoLISP, обработка ошибок ввода данных пользователем, и обработка ошибок исполняемого модуля OpenDCL. Обработку стандартных ошибок AutoLISP здесь рассматривать не будем.
Обработка ошибок ввода данных пользователем
Правильно спроектированный графический дизайн пользовательского интерфейса должен, по мере возможности, в первую очередь сам по себе предотвращать ошибки ввода данных пользователем. OpenDCL позволяет динамически отключать (или скрывать) определенные элементы управления прямо во время выполнения программы, что дает возможность перенастроить взаимозависимые элементы при изменении каких-либо условий, апользователь смог совершить только действительно правильный ввод. Поэтому хороший пользовательский интерфейс является первой линией обороны против недопустимого ввода.
Обработка ошибок пользовательского ввода в формах OpenDCL должна производиться с помощью обработчиков событий отдельных элементов управления или же всей формы в целом. Некоторые элементы управления, такие как текстовые поля, поддерживают фильтры вводимых данных для предотвращения неверного ввода. Использование таких элементов управления, какполя выпадающим со списком или переключателей может заранее ограничить ввод пользователем определенных значений. Для поддерживаемых форм событие CancelClose может быть использовано для проверки ввода в форме и предотвратить закрытие диалога если будет найден неверный ввод .
Ниже приведен стандартный сценарий использования события CancelClose :
(defun HighlightFormErrors () ; возвращает T при ошибке, иначе - NIL (if (CheckForFormInputErrors) ; вызов проверяющей функции (progn ;; Здесь можно указать на ошибку, отобразить окно сообщения с дополнительной информацией, ;; или сделать что-то, чтобы исправить ошибку (затем нужно вернуть NIL, если ошибка исправлена!) (dcl-MessageBox "Форма содержит недопустимые данные!" "Error" 2 4)
T ; возвращаем T как признак найденной и не пока нерешенной ошибки ) ) ; Обратите внимание, что эта функция возвращает NIL, если никакие ошибки не были найдены ) (defun c:Project1/Form1#OnCancelClose( Canceling /)
;; Возвращает T, предотвращая закрытие формы (если нажата не "отмена"), и указывает на обнаруженные ошибки (and (/= 1 Canceling) (HighlightFormErrors)) ; Все равно разрешть закрыть форму, если была нажата "отмена"
Ошибки исполняемого модуля OpenDCL
Вызов встроенных функций OpenDCL может привести к двум типам ошибок: исключениям или функциональным сбоям.
Исключения указывают на ошибку в коде, например, при передаче в фунцию неправильного типа аргумента, или аргумента с недопустимым значением. Если сообщения OpenDCL не подавляются (смотри ПодавлениеСообщений), то сообщение об исключении приводятся во всплывающем окне и описывает расположение и характер исключения, вызванного ошибкой AutoLISP и остановившего работу программы. В сообщении отображается имя функции и индекс ее аргумента(нумерация с нуля), для которого произошло исключение.
Функциональные сбои обычно показаны как функция, возвращающая NIL. Например, при попытке установить текущую выбор в списке на несуществующий элемент списка возвращает значение NIL. Такие типы ошибокпри желании можно обработатывать в коде, а в некоторых случаях просто игнорировать.