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

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.

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