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