Обработка ошибок

Обработчик ошибок «КАСКАД Цифра» использует следующую информацию для обработки ошибок:

  • Код ошибки
  • Дата и время возникновения
  • Приоритет (критическая, серьезная, предупреждение, уведомление)
  • Классификация (системная ошибка/ошибка реализации, ошибка конфигурации, системная ошибка «КАСКАД Цифра»…)
  • Дополнительная информация, например, имя функции, идентификатор пользователя, имя точки данных и так далее.

Подобная информация об ошибках сохраняется менеджерами в переменных типа «errClass» (или «dyn_errClass») и обычно записывается в файл журнала «КАСКАД Цифра» (см. параметр командной строки «-log» или записи «logFile», «logStdErr» в конфигурационном файле config). В ОС Windows содержание файла PVSS_II.log консоли автоматически отображается в средстве просмотра журналов, а файлы журналов менеджеров сохраняются в директории «<путь_проекта>/log». В ОС Linux информация о стандартных ошибках (Standard-Error) может быть получена при помощи «pv2mon».

Переменные типа «errClass» создаются менеджерами при возникновении ошибки, например, при запуске менеджера. Также переменные типа «errClass» могут создаваться сценарием CONTROL или интерфейсом пользователя, например, при опросе несуществующего атрибута точки данных, если отсутствие атрибута интерпретируется как ошибка (поскольку попытка чтения может быть просто проверкой на наличие атрибута). В подобных ситуациях принятие решения о наличии ошибки осуществляется интерфейсом пользователя на основании ответа от менеджера событий (например, при использовании функций «dpGet()» или «dpSetWait()», при этом в случае ошибки ответ будет содержать переменную типа «dyn_errClass»). Данная переменная может быть опрошена при помощи функции «getLastError()» и обработана в соответствии с содержанием ошибки.

Сообщения об ошибках при выполнении сценариев CTRL

В том случае, если в ходе выполнения сценария обнаруживается внутренняя ошибка (например, программист забыл объявить переменную перед ее использованием), то создается внутренняя переменная типа «errClass» (для последующей обработки ошибок «КАСКАД Цифра»). Как правило, система записывает содержимое переменной типа «errClass» в файл журнала «КАСКАД Цифра».

Сообщение об ошибке при выполнения сценария CTRL содержит, среди прочей информации, файл и номер строки, связанной с ошибкой. Сообщение об ошибке содержит следующую информацию:

Panel: <Имя файла>[<Имя панели>]
Object: <Идентификационный номер>[<Имя объекта>]
In reference: <Имя файла>[<Имя панели>]
                       used in:<Имя файла>[<Имя панели>]
                       used in:<Имя файла>[<Имя панели>]
                       …
                       used in:<Имя файла>[<Имя панели>]
File: <Имя файла>
Script: <Имя соответствующего свойства>
Line: <Номер строки>

Данная информация подразумевает следующее:

ИнформацияЗначение
PanelПанель, в которой возникла ошибка
ObjectОбъект, в котором возникла ошибка
In referenceЕсли ошибка возникла в панели-ссылке, то в журнал выводится полный путь. Сначала выводится имя панели, содержащий графический объект, после чего последовательно указываются все родительские панели.
FileФайл, в котором возникла ошибка, например, библиотека CTRL.
ScriptИмя свойства, которому сопоставлен ошибочный сценарий CTRL.
LineНомер строки

ЗначокПРИМЕР 1

WCCOANG(1), 2003.06.30 12:51:30.857, CTRL, WARNING, 78, Assignment to this expression impossible,
Panel: test_ctrl_fkt.pnl []
Object: 0 [Button1]
Script: EventClick
Line: 3

ЗначокПРИМЕР 2

WCCOANG(1), 2003.06.03 12:51:30.857, CTRL, WARNING, 73, Variable not defined,
Panel: test_ctrl_fkt.pnl []
Object: 0 [Button1]
Script: EventClick
Line: 3

Функция «getLastError()» позволяет получить последнюю ошибку, связанную с какой-либо ожидающей функцией, и поместить информацию об ошибке в переменную типа «errClass». Сообщение об ошибке также может быть выведено в диалоговое окно при помощи функции «errorDialog()«. Сообщение об ошибке может быть принудительно сформировано и передано во внутренний обработчик ошибок при помощи функции «throwError()«.

ПРИМЕЧАНИЕ

Некоторые функции (например, «dpSetWait()», «dpCreate()», «dpTypeChange()», …) могут возвращать значение 0, даже если функция завершилась с ошибкой (обычно, функция, завершившаяся со сбоем, возвращает значение -1). Это означает, что пользователю необходимо запросить возможную ошибку при помощи «getLastError()» и проверить, успешно ли выполнилась функция (см. пример функции «dpWaitForValue()» ниже).

Пример функции, возвращающей 0 при завершении с ошибкой:

В интерфейсе пользователя вызывается функция «dpSetWait()», которая обращается к несуществующей точке данных. Пользовательскому интерфейсу известно, что данной точки данных не существует. В связи с этим пользовательский интерфейс возвращает -1. Однако при выполнении функции «dpSetWait()» применительно к несуществующему конфигурационному элементу/атрибуту элемента точки данных функция обманчиво возвращает 0 (т.к. пользовательскому интерфейсу доподлинно не известно, существует ли тот или иной конфигурационный элемент или нет). Проверка на предмет наличия ошибок при выполнении функции может быть выполнена при помощи «getLastError()».

Для хранения информации об ошибках в системе «КАСКАД Цифра» используются переменные типа «errClass» (или массивы переменных «dyn_errClass»). Значение переменной для хранения ошибки может быть присвоено значению другой переменной для хранения ошибки или значению строковой переменной. Отдельные атрибуты могут быть прочитаны при помощи подходящих функций.

ЗначокПРИМЕР:

Пример с использованием функции «dpWaitForValue()»:

main()

{

time t = 1;

dyn_errClass err;

dyn_string wait;

dyn_string ret;

dyn_anytype conditions;

dyn_anytype target;

conditions[1] = false;

wait = makeDynString(«test.b:_original.._value»);

ret = makeDynString(«test_0.b:_original.._value»);

dpWaitForValue(wait,conditions,ret,target,t);

err = getLastError(); // Проверка на предмет наличия ошибок

if (dynlen(err) > 0)

{

errorDialog(err); // Открытие диалогового окна для вывода ошибки

throwError(err); // Запись ошибки в stderr

}

else

{

DebugN(«OK»); // Ошибок нет

}

}

ЗначокПРИМЕР:

main()

{

int rc=dpSetWait(«Valve17.opening:_default.._type»,DPCONFIG_DEFAULTVALUE);

DebugN(rc);

if ( dynlen(getLastError()) )

//… обработка ошибок…

}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *