Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Управление режимом break

В Турбо Прологе есть мощные средства для управления режимом BREAK.

Предикат trap позволяет обрабатывать BREAK. Если BREAK появляется в части

программы, охваченной предикатом trap, то коду ошибки будет присвоено

значение 0. Если trap не применяется, то выполнение программы прерывается

и выполняется возврат в DOS.

Важно уяснить как работает механизм BREAK. BREAK не прерывает мгно-

венно выполнение программы. Во-первых, система Турбо Пролога должна обна-

ружить нажатие клавиши BREAK. Есть два случая, в которых программа рас-

познает BREAK:

- Если не применяется директива nobreak, то генерируются

коды, осуществляющие проверку нажатия клавиши Break перед

входом в каждый предикат.

- Большинство стандартных подпрограмм выполняют проверку

нажатия клавиши BREAK.

Когда система обнаруживает BREAK, то ее реакция зависит от режима,

установленного с помощью предиката break: либо будет выполняться переход

к стандартному предикату trap, либо, если режим BREAK отключен, внутрен-

няя переменная получит такое значение, при котором предикат breakpressed

выполняется успешно.

Break/1

Предикат break позволяет включать и отключать режим проверки нажатия

клавиши Ctrl-Break в процессе выполнения программы. Предикат break запи-

сывается в следующем виде:

break(on) /* (i); включает режим BREAK */

break(off) /* (i); отключает режим BREAK */

break(BreakStatus) /* (0);возвращает текущее состояние BREAK */

break(off),

update:-

break(OldBreak),

break(off),

/* ... возобновляет режим */

break(OldBreak).

Breakpressed/0

Предикат breakpressed выполняется успешно, если была нажата клавиша

Ctrl-Break, даже если режим BREAK был отключен с помощью break(off), или,

если программа была скомпилирована с директивой nobreak.

Углубленный контроль ошибок в .Exe файлах

Библиотека Турбо Пролога содержит ряд стандартных процедур для обра-

ботки ошибок, используемых по умолчанию, но вы можете вместо них исполь-

зовать свои собственные предложения. В этом разделе мы рассмотрим две

процедуры - criticalerror и fileerror. При возникновении ошибки, связан-

ной с DOS, вызывается criticalerror, а при возникновении ошибки, связан-

ной с файлами - fileerror. Если вы объявите эти предикаты как глобальные

и напишите для них ваши собственные предложения, то компоновщик подключит

их вместо библиотечных процедур.

В результате вы можете получить более удобный для вас механизм обра-

ботки ошибок. При этом может сократиться размер .EXE файла, поскольку

стандартные процедуры обработки ошибок являются весьма обобщенными, расс-

читанными на множество ситуаций, которые никогда не возникают в вашей

конкретной программе).

Criticalerror/4

В Турбо Прологе эта процедура служит для обработки критических оши-

бок (прерывание 24Н DOS). Если вы хотите создать ваш собственный вариант

criticalerror, то вы должны объявить следующий глобальный предикат:

global predicates

criticalerror(ErrNo, ErrType, DiskNo, Action) -

(i,i,i,o) language c

Предикат criticalerror всегда выполняется успешно и работает только

в .EXE файлах. Предикат criticalerror замещает обработчик прерываний DOS

и на него накладываются такие же ограничения. Вы можете применять только

обращения к функциям DOS от 01h до 0Ch и 59h - что позволяет работать с

консольным вводом/выводом и больше ничего. Если в вашей программе есть

обращения к другим функциям DOS, то операционная система реагирует на них

непредсказуемым образом.

Таблица 19.1: Значения аргументов для предиката criticalerror

-----------------------------------------------------------------

Аргумент Значение

-----------------------------------------------------------------

ErrNo =0 Попытка записи на защищенный диск

=1 Неизвестное устройство

=2 Устройство не готово

=3 Неизвестная команда

=4 CRC ошибка данных

=5 Неверная длина записи при обращении к устройству

=6 Ошибка при поиске

=7 Среда неизвестного типа

=8 Сектор не найден

=9 Отсутствует бумага в принтере

=10 Ошибка записи

=11 Ошибка чтения

=12 Общая ошибка

ErrType =0 Ошибка символьного устройства

=1 Ошибка при чтении с диска

=2 Ошибка при записи на диск

DiskNo =0-25 Означает устройство от А до Z

Action =0 Прервать текущую операцию

=1 Повторить текущую операцию

=2 Игнорировать текущую операцию (это может иметь

тяжелые последствия и потому лучше этим не

пользоваться)

-----------------------------------------------------------------

Соседние файлы в папке Документация