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

Обработка ошибок при чтении термов

Когда вы обращаетесь к предикатам consult или readterm и при чтении

строки возникает ошибка, то выполнение предиката завершается неудачей. К

синтаксическим ошибкам можно отнести следующие:

- строка не имеет окончания;

- вместо числа в строке стоит символьный тип;

- название предиката содержит заглавные буквы;

- символьный тип не заключен в двойные кавычки;

- и т.д.

Когда в Турбо Пролог был введен предикат consult, то первоначально

предполагалось, что он будет применяться только для чтения файлов, полу-

ченных с помощью предиката save, а не для чтения файлов, созданных поль-

зователем. Для облегчения ввода файлов, отредактированных пользователем,

были введены два предиката readtermerror и consulterror. Вы можете приме-

нять их для того, чтобы получить информацию о том, какого рода ошибки

возникают при использовании соответственно readterm и consult.

Если ошибки, возникающие при выполнении consult и readterm обрабаты-

ваются с помощью предиката trap, то предикаты consulterror и

readtermerror позволяют вам исследовать и устранить синтаксическую ошиб-

ку.

Consulterror/3

Предикат consulterror выдает информацию о строке, содержащей синтак-

сическую ошибку

consulterror(Line, LinePos, FilePos),

Параметр Line связан со строкой, содержащей синтаксическую ошибку,

LinePos указывает на позицию ошибки в строке, а FilePos указывает на по-

зицию строки в файле.

Readtermerror/2

Предикат readtermerror выдает информацию о строке, содержащей син-

таксическую ошибку

readtermerror(Line, LinePos), /* (0,0) */

Параметр Line связан со строкой, содержащей синтаксическую ошибку,

LinePos указывает на позицию ошибки в строке.

В следующем примере показано как можно реализовать предикат consult

в виде, защищенном от ошибок. Когда при использовании предиката consult в

файле встречается синтаксическая ошибка, этот файл загружается в редак-

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

экрана выводится сообщение об ошибке, что позволяет исправлять ошибки.

/* Program CH19EX02.PRO */

domains

dom = f(INTEGER)

list = integer *

database - mydba

p1(INTEGER, STRING, CHAR, REAL, DOM, LIST)

predicates

repeat

handleconsulterr(STRING, INTEGER)

clauses

repeat.

repeat:-repeat.

handleconsulterr(File, Err):-

Err>1100, Err<1110, !,

retractall(_, mydba),

consulterror(_, LinePos, Filepos),

Pos=LinePos+FilePos,

% may need a path to "..\\prolog.err"

errormsg("prolog.err", Err, Msg, _),

file_str(File, Str),

edit(Str,Str1,"Consult error", File, Msg, Pos,"prolog.hlp",

1, 1, 1, 0, _, RetStatus),

RetStatus=0,

file_str(File, Str1).

handleconsulterr(_, Err):-

exit(Err).

goal

repeat,

File="dd.dat",

trap(consult(File, mydba),Err, handleconsulterr(File,Err)),

write("\nSUCCESS\n"),

save(con, mydba).

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