Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

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

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

Перечислим коды ошибок, возвращаемые программе через регистр AX.

Код Описание
01 Указан неправильный код функции
02 Файл не найден
03 Путь не найден
04 Слишком много открытых файлов
05 Доступ запрещен
06 Неправильный идентификатор
07 Разрушен блок управления памятью
08 Недостаточно памяти
09 Неправильный адрес блока памяти
0Ah Неправильная среда
0Bh Неправильный формат
0Ch Неправильный доступ
0Dh Неправильные данные
0Eh Зарезервировано
0Fh Ошибка при указании диска
10h Невозможно удалить текущий каталогтекущий каталог
11h Другое устройство
12h Больше нет файлов

Для MS-DOS версии 3.0 и более поздних версий обработка ошибок значительно расширена. Введена функция 59h, предназначенная для получения дополнительной информации об ошибках.

При вызове этой функции регистр BX должен содержать индикатор уровня анализа ошибок, который должен быть равен 0. Кроме расширенного кода ошибки, возвращаемого в регистре AX, программа может получить класс ошибки (регистр BH), код предполагаемых действий (регистр BL), локализацию ошибки (регистр CH).

К сожалению, эта функция разрушает содержимое регистров CL, DX, SI, DI, BP, DS, ES. Программа, использующая функцию 59h прерывания INT 21h, должна позаботиться о сохранении содержимого этих регистров.

Расширенный код ошибки, возвращаемый в регистре AX, может принимать значения, указанные ниже. Коды от 1 до 12h эквивалентны кодам, рассмотренным ранее и второй раз не приводятся.

Код Описание
13h Выполнена попытка записи на защищенный от записи диск
14h Указан неизвестный идентификатор устройства
15h Диск не готов
16h Неизвестная команда
17h Ошибка циклического кода проверки
18h Неправильная длина структуры запроса
19h Ошибка при поиске
1Ah Неизвестен тип среды носителя данных
1Bh Сектор не найден
1Ch Кончилась бумага в принтере
1Dh Ошибка записи
3Eh Ошибка чтения
1Fh Общая ошибка
20h Ошибка при доступе к совместно используемому файлу
21h Нарушение блокировки файла
22h Неправильный диск
23h FCBFCB недоступен (слишком много блоков FCB)
24h Переполнился буфер, предназначенный для совместного доступа к файлам
25h Несоответствие кодовых страниц
26h Ошибка при обработке конца файла
27h Переполнение диска
28h - 31h Зарезервировано
32h Сетевая функция не поддерживается
33h Удаленный компьютер не отвечает
34h Дублирование имени в сети
35h Сетевое имя не найдено
36h Сеть занята
37h Сетевое устройство больше не существует
38h Слишком много команд
39h Ошибка в аппаратуре сетевого адаптера
3Ah Неправильный ответ из сети
3Bh Непредусмотренная ошибка сети
3Ch Несовместимый удаленный адаптер
3Dh Переполнена очередь печати
3Eh Мало места в очереди печати
3Fh Печать отменена
40h Сетевое имя было удалено
41h Доступ к сетевому ресурсу запрещен
42h Неправильный тип сетевого устройства
43h Сетевое имя не найдено
44h Слишком много сетевых имен
45h Слишком много сеансов связи
46h Совместное использование ресурсов в сети временно отменено
47h Сетевой запрос отвергнут
48h Переадресация приостановлена
49h - 4Fh Зарезервировано
50h Файл уже существует
51h Дублирование блока FCBFCB
52h Невозможно создать дескриптор в каталоге
53h Ошибка обработчика критических ошибок INT 24hINT 24h
54h Слишком много переназначений
55h Двойное переназначение
56h Неправильный пароль
57h Неправильный параметр
58h Ошибка при записи данных в сети
59h Нет такой функции в сети
5Ah Не установлен необходимый компонент системы

Класс ошибки, передаваемый в регистре BH, содержит информацию, которая поможет вам обработать данную ошибку:

Класс ошибки Описание
1 Недостаточно ресурсов: блоков FCBFCB, памяти и т. д.
2 Временная ситуация, попробуйте повторить операцию позже
3 Нет прав доступа
4 Внутренняя ошибка MS-DOS
5 Ошибка аппаратуры
6 Системная ошибка MS-DOS
7 Ошибка в прикладной программе
8 Файл или объект не найден
9 Неправильный формат файла или объекта
10 Файл или объект заблокирован
11 Ошибка носителя данных
12 Файл или объект уже существует
13 Прочие ошибки

Код предполагаемых действий, передаваемый через регистр BL, поможет вашей программе правильно обработать ошибку. Приведем список кодов предполагаемых действий:

Код Рекомендуемые действия
1 Повторить операцию позже. Можно спросить пользователя, желает он повторить операцию или завершить работу программы
2 Повторить предыдущую операцию после небольшой паузы. Если ошибка не исчезла, следует спросить пользователя, будет он ждать и дальше, или следует завершить работу программы
3 Если пользователь вводил какие-то данные для MS-DOS, следует попросить его ввести эти данные еще раз (например, пользователь мог указать неправильный идентификатор диска или путь доступа к файлу)
4 Аварийно завершить работу прикладной программы с выполнением всех обычных завершающих действий (закрытие файлов, сброс буферов на диск, освобождение блоков памяти и т. д.)
5 Немедленный выход из программы без выполнения завершающих действий. Система находится в непредсказуемом состоянии
6 Следует игнорировать ошибку
7 Повторить операцию, после того как пользователь выполнит требуемые действия (установит дискету и т. п.)

Сведения о локализации ошибки передаются в регистре CH. Приведем список кодов локализации:

Код Место, где произошла ошибка
1 Система не знает, где произошла ошибка
2 В устройстве, выполняющем обмен данными отдельными блоками (диск или магнитная лента)
3 Ошибка связана с сетью
4 В символьном устройстве, например, в принтере
5 Ошибка связана с оперативной памятью

Если ваша программа составлена на языке ассемблера, то после обращения к MS-DOS через прерывание следует проверить состояние флага переноса:

int  21h
jc   error

MS-DOS имеет еще одно средство для обработки ошибок - обработчик критических ошибок (Critical Error Handler). Этот модуль вызывается MS-DOS, когда она получает сообщение об ошибке от драйвера устройства.

Модуль выдает на экран хорошо известное вам сообщение:

Abort, Retry, Fail?

Это сообщение обычно появляется тогда, когда вы забываете вставить дискету или начинаете печатать при отключенном принтере.

Прикладные программы могут подключать свой модуль обработки критических ошибок вместо стандартного модуля.

А теперь расскажем более подробно о том, как программа может вызывать прерывания MS-DOS.

[Назад] [Содеожание] [Дальше]