Документация по Clarion

       

NOTIFY (обработка критических ошибок)


NOTIFY(процедура,событие)

процедура Метка ПРОЦЕДУРЫ, прототип которой, должен быть объявлен в MAP, как получающий *STRING-параметр (STRING передается по адресу).
событие Целочисленная константа, переменная или выражение. Если ноль, то процедура NOTIFY отменяется; если один, то критические ошибки DOS
обрабатываются процедурой.

Оператор NOTIFY "взводит" (SPA. А как еще перевести слово arms?) процедуру для обработки критических ошибок ДОС. Эта процедура получает параметр типа *STRING, на адрес которого, передается управление при возникновении критической ошибки.
Назначение этой ПРОЦЕДУРЫ - позволить Clarion-приложениям обрабатыать критические ошибки. ПРОЦЕДУРА может выполнять дисковые операции или любые другие действия. Выход из ПРОЦЕДУРЫ должен осуществляться оператором RETURN, (RESTART крайне не рекомендуется) и процедура должна выбирать и анализировать значение, которое DOS определяет для конкретной ошибки
STRING-параметр, передаваемый по адресу в процедуру может быть изначально назначен GROUP, для подавления необходимости синтаксического разбора строки для получения информации об ошибке. GROUP может быть описана как глобально (Глобальные Статические Данные) так и локально по отношению к модулю-ЧЛЕНУ (Локальные Статические Данные) для уменьшения потребностей в выделении памяти на стеке. GROUP может быть описана со следующими полями:
CritParmGroup GROUP,PRE(Crt) !Описание параметра-группы
Status LONG !Состояние обработки, 1 для критич.ошиб.
CritType SHORT !Код критической ошибки, 1-12, 15
CritMsg STRING(25) !Описание критической ошибки


CritDev STRING(25) !Имя устройства на котором ошибка
RetVal STRING(1) !Возвращаемое значение - A, I, R или F
.
Критические ошибки ДОС, которые могут быть обработаны ПРОЦЕДУРОЙ

CritType CritMsg
0 Защита от записи
1 Неверный номер диска
2 Диск(овод) не готов
3 Затребована неизвестная команда
4 Ошибка контрольной суммы (CRC)
5 Неверная длина структуры-запроса
6 Ошибка поиска
7 Неизвестный формат диска
8 Сектор не найден
9 В бумаге кончился принтер :-) :-)
10 Сбой при записи
11 Сбой при чтении
12 Общая, неспецифичная ошибка
15 Неверная смена диска (?)
<
После присвоения переданного параметра STRING ГРУППЕ (GROUP), процедура может определить, какая ошибка произошла, из значений CritType (номер ошибки), CritMsg (описание ошибки) и CritDev (отказавшее устройство). Затем, она может определить, какую опцию выбрать для конкретной ошибки и присвоить ее переменной RetVal.
Разрешенные значения для RetVal:
I Ignore (игнорировать ошибку)
R Retry (повторить действие, приведшее к ошибке)
A Abort (отменить действие, приведшее к ошибке)
F Fail (прекратить выполнение и выйти в ДОС)
Значение RetVal в конце процедуры определяет, как ошибка обработана. Выбранная опция возвращается присвоением ГРУППЫ переданному параметру *STRING в конце процедуры.
Пример:
Этот примерный код содержит два примера обработчиков критических ошибок. PrinterReady специфична для ошибок принтера, а ErrorProc - обработчик прочих ошибок.
PROGRAM
MAP
PrintReport !Процедура печати
PrinterReady(*STRING) !Обработчик ошибок принтера
ErrorProc(*STRING) !Обработчик остальных ошибок
.
CritParmGroup GROUP,PRE(Crt) !Описание группы параметров
Status LONG !Processing status, always 1
CritType SHORT !Critical error code, 1-12, 15
CritMsg STRING(25) !Critical error description
CritDev STRING(25) !Error device name string
RetVal STRING(L) !Action option chosen-A,I,R,or F
.
ErrFlag BYTE(0) !Флаг присутствия ошибки
CODE
PrintReport !Вызов процедуры-отчета
NOTIFY(ErrorProc,1) !Взводим обработчик общих оши-
! бок
!Здесь находится какой-то исполняемый код
PrintReport PROCEDURE
!Здесь описываем формат отчета
ErrScreen SCREEN(15,56),PRE(Scr),CQLOR(73),CENTER,SHADOW,CUA
ROW(1,1) STRING('г={54}ѓ')
ROW(2,1) REPEAT(13);STRING('Ѓ<O{54}>Ѓ')
ROW(15,1) STRING('L={54}-')
ROW(3,16) STRING('Ошибка -- Проверь принтер!')
ROW(13,16) STRING('Ошибка -- Проверь Принтер!')
.
CODE
NOTIFY(PrinterReady,1) !Взводим обработчик ошибок
! принтера
PRINT('<27>') !Посылаем ESC на принтер
IF ErrFlag !Была ли критическая ошибка?
OPEN(ErrScreen) ! вывести экран с предупрежд.


ASK ! ждем нажатия на клавишу
ErrFlag = 0 ! сбрасываем флаг ошибки
RETURN ! и вываливаемся
.
!Здесь остальной код отчета
PrinterReady PROCEDURE(ParmString)!Обработчик ошибок принтера
CODE
ErrFlag = 1 !Была критическая ошибка!
CritParmGroup = ParmString !Какя именно?
Crt:RetVal = 'F' !Отказ от продолжения
ParmString = CritParmGroup !Вернуть данные в параметр
ErrorProc PROCEDURE(ParmString) !Обработчик общих ошибок
Opt STRING(1) !Размещается на стеке
ErrScreen SCREEN(3,40),PRE(Scr),COLOR(79),CENTER,CUA
ROW(1,2) STRING('Ошибка:')
ErrDesc ROW(1,10) STRING(25)
ErrDevice ROW(2,10) STRING(25)
ROW(3,2) STRING('Выбери: Abort Retry Ignore Fail')
CODE
CritParmGroup=ParmString !Получить данные об ошибке
OPEN(ErrScreen) !Открыть экран
Scr:ErrDesc = Crt:CritMsg !Получить описание ошибки
Scr:ErrDevice = Crt:CritDev ! и устройстве
LOOP !Цикл для ввода допустимого
! выбора
ASK !Ждем ввода с клавиатуры
Opt = UPPER(KEYCODE())
IF Opt <> 'A' AND Opt <> 'R' AND Opt <> 'I' AND Opt <> 'F'
!Если выбранная опция недопус-
! тима, то
BEEP ! предупреждаем пользователя
CYCLE ! и повторяем ввод
ELSE !Иначе,
BREAK ! продолжаем
. . !Конец операторов IF и LOOP
Crt:RetVal = Opt !Помещаем опцию, выбранную поль-
! зователем в CritParmGroup
ParmString = CritParmGroup !Вернуть данные в параметр

Содержание раздела