MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 18, М.: Диалог-МИФИ, 1995, 254 стр. 1.8. Программа ERRCODEПриведем пример программы с именем ERRCODE (листинг 1.1), которая стирает каталог с именем DIR в текущем каталоге и, в случае ошибки, выводит расширенную информацию об ошибке, класс ошибки, код предполагаемых действий и код локализации ошибки. Листинг 1.1. Файл errcode\errcode.cpp #include <dos.h>
#include <stdio.h>
#include <conio.h>
union REGS inregs, outregs;
struct SREGS segregs;
void main(void);
void main(void)
{
char far *dir_name = "DIR";
// Стираем каталог с именем DIR. Для этого вызываем
// функцию 0x3A прерывания INT 21h
inregs.h.ah = 0x3a;
segregs.ds = FP_SEG(dir_name);
inregs.x.dx = FP_OFF(dir_name);
intdosx(&inregs, &outregs, &segregs);
// Если после выполнения прерывания установлен
// флаг переноса, выводим сообщение об ошибке
if(outregs.x.cflag != 0)
{
printf("\n\nОшибка при удалении каталога:\t%d",
outregs.x.ax);
// Получаем расширенную информацию об ошибке
// с помощью функции 0x59 прерывания INT 21h
inregs.h.ah = 0x59;
inregs.x.bx = 0;
// Сохраняем регистры в стеке, так как их содержимое
// изменится
asm push ds
asm push es
asm push si
asm push di
// Вызываем прерывание
intdosx(&inregs, &outregs, &segregs);
// Восстанавливаем содержимое регистров
asm pop di
asm pop si
asm pop es
asm pop ds
// Выводим расширенную информацию об ошибке
printf("\nРасширенный код ошибки: \t%d"
"\nКласс ошибки: \t%d"
"\nПредполагаемые действия:\t%d"
"\nЛокализация ошибки: \t%d",
outregs.x.ax, outregs.h.bh,
outregs.h.bl, outregs.h.ch);
}
printf("\n\nНажмите любую клавишу...");
getch();
}
При составлении программ обработки ошибок следует учитывать, что некоторые старые функции MS-DOS возвращают при ошибке в регистре AX значение 0FFh. Начиная с версии MS-DOS 2.0 в случае возникновения ошибки устанавливается флаг переноса. При этом код ошибки записывается в регистр AX. Однако для более полной диагностики причины ошибки следует использовать функцию 59h прерывания INT 21h. |

