Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Обнаружение и анализ ошибок устройства

ОГЛАВЛЕНИЕ

     7.2.5 Обнаружение и анализ ошибок устройства.


   Устройства могут ошибаться по одной из трех причин. Устройство
может быть физически повреждено  или  находиться не в том состоя-
нии.  Может быть плохим программное обеспечение, управляющее уст-
ройством. И, наконец, программа может послать устройству недопус-
тимый  запрос (например, попытка писать на накопитель, где  нахо-
дится дискета защищенная от записи). MS DOS обнаруживает и анали-
зирует  большинство таких ошибок и обеспечивает  возможности  для
восстановления.

   Высокий уровень.


   Интерпретатор  Бейсика  обнаруживает   многие  ошибки, включая
ошибки  драйверов устройств.  При обнаружении ошибки возвращается
код ошибки и если не  предусмотрена  программа восстановления при
ошибках,  то программа останавливается.  Однако можно  установить
обработку ошибок, с тем чтобы когда происходит критическая ошибка
Бейсик  автоматически переходил на процедуру  восстановления  при
сбоях, которую Вы создали. Процедура может проанализировать код и
определить в какой строке программы произошла ошибка.  После того
как это сделано, программа может принять меры по устранению ошиб-
ки, либо с помощью пользователя, либо выполняя другую часть прог-
раммы.  После того, как эта  процедура завершена, программа может
продолжить  выполнение с любого места, с которого Вы захотите  (с
некоторыми ограничениями). Код  для тщательного анализа ошибочных
ситуаций может существенно увеличить размер программы.   Отметим,
что компилятора Бейсика даже  минимальные проверки на ошибки пот-
ребуют  дополнительно  по не менее чем 4 байта на  каждую  строку
программы.
   Чтобы разрешить обработку  ошибок в Бейсике поместите в начале
программы  строку ON ERROR GOSUB n, где n это номер строки  прог-
раммы, в которой начинается процедура обработки ошибок.  При воз-
никновении  критической ошибки управление будет передано  на  эту
строку. В начале  процедуры  поместите  ряд строк вида IF ERR = n
THEN  номерстроки,  где n - номер ошибки, взятый из приложения  к
руководству по Бейсику, содержащему  сообщения об ошибках. Номера
строк в этих операторах соответствуют началу кода, обрабатывающе-
го данную конкретную ошибку.  Эти части могут быть в свою очередь
разбиты  на  куски рядом операторов IF ERL = n THEN  номерстроки.
ERL возвращает номер строки, в которой произошла ошибка, позволяя
процедуре восстановления точно определить ошибочное место.
   После того как процедура восстановления завершила свою  работу
надо использовать  оператор  RESUME  для возврата управления в ту
строку, где произошла ошибка.  За этим оператором может следовать
номер, в этом случае управление  будет  передано на строку с ука-
занным  номером.  Однако, имейте ввиду, что  нельзя  использовать
RESUME для перехода в точку  программы, которая находится за пре-
делами процедуры, в которой произошла ошибка. Если восстановление

после ошибки невозможно, но необходимо, чтобы программа продолжи-
ла  свою работу, то напишите RESUME NEXT и управление будет пере-
дано на строку, следующую за той, в которой произошла ошибка. Вот
общая структура процедуры восстановления в Бейсике:

100 ON ERROR GOSUB 5000   'разрешаем обработку ошибок
 .
 .
5000 IF ERR = 61 THEN 5100  'диск полон
5010 IF ERR = 71 THEN 5200  'диск не готов
 .
 .
5100 IF ERL = 2080 THEN 5120   'где произошла ошибка?
5110 BEEP: PRINT "Disk in drive B: is full": RESUME
5120 BEEP: PRINT "Disk in drive A: is full": RESUME
 .
5200 BEEP: PRINT "A disk drive is not ready"
5210 PRINT "Strike any key when corrected"
5220 IF INKEY$ = "" THEN 5220    'ожидаем нажатия клавиши
5230 RESUME ERL - 10             'пытаемся повторить операцию

   В Бейсике 3.0 введены инструкции ERDEV и ERDEV$.  Обе они поз-
воляют получить переменные  только  для чтения от прерывания 24H,
обрабатывающего  критичекие  ошибки.  Z% = ERDEV возвращает в  Z%
слово статуса, в котором старший байт содержит 13-15 биты атрибу-
та  заголовка устройства, а младший байт - код ошибки  прерывания
24H.  Z$ = ERDEV$ помещает в Z$ 8-байтное имя устройства для сим-
вольных  устройств  и 2-байтный указатель накопителя для  блочных
устройств.