Справочник программиста на персональном компьютере фирмы 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-байтный указатель накопителя для блочных
устройств.