logo search
TurboProlog / Документация / TOM_1

Exit/o и exit/1

Обращение к предикату exit оказывает действие, аналогичное возникно-

вению ошибки в процессе выполнения программы. Если при обращении к exit

выполнение программы прекращается, то переменная ErrorLevel в DOS получит

значение, указанное в предикате exit. Если exit не имеет аргумента, то

это значение равно нулю:

exit /* без аргумента */

exit (ExitCode) /* (i) */

Если обращение к exit сопровождается обращением к trap, то значение

из exit будет передано в trap.

trap/3

Для обработки исключений и прерываний, связанных с ошибками, приме-

няется предикат trap, который содержит три аргумента. Первый и третий ар-

гумент являются обращениями к предикатам, а второй аргумент представляет

собой переменную:

trap(PredicateCall, ExitCode, PredicateToCallOnError)

Рассмотрим, например, следующий фрагмент:

trap(menuact(P1,P2,P3), ExitCode, error(ExitCode,P1)),...

Если в процессе выполнения menuact, включая все последующие подцели,

возникнет ошибка, то переменной ExitCode будет передан код ошибки, а за-

тем для обработки ошибки будет вызван предикат error. При этом выполнение

trap после возвращения из error завершится неудачей. Если manuact завер-

шится успешно, то выполнение программы будет продолжено.

Перед обращением к предикату error, система восстановит в стеке,

глобальном стеке и области trail те значения, которые содержались в них

перед обращением к menuact. Это означает, что вы можете применять trap

для предотвращения переполнения памяти.

Если прерывание разрешено (break on) и оно возникает (поскольку

пользователь нажал Ctrl-Break в процессе выполнения предиката включенного

в trap), то trap позволяет обнаружить BREAK и переменной ExitCode присва-

ивается значение 0.

/* Program CH19EX01.PRO trapping the "file not open" error */

domains

file = dd

predicates

error(integer)

process(string)

clauses

process("a").

process("b") :- writedevice(dd).

error(E) :- writef("\nerror(%)", E).

goal

trap(process(A), E, error(E) ),

write("\nSuccessful process: A=", A),

fail.