Prolog Language
Обработка ошибок и исключения
Поиск…
Ошибки создания
Ошибка создания экземпляра создается, если аргумент недостаточно инстанцирован .
Критически, ошибка создания экземпляра не может быть заменена молчащим сбоем : провал в таких случаях означает, что нет решения , тогда как ошибка создания означает, что экземпляр аргумента может участвовать в решении.
Это контрастирует, например, с ошибкой домена , которая может быть заменена молчащим сбоем без изменения декларативного значения программы.
Общие положения об обработке ошибок
В функциях Prolog есть исключения , которые являются частью стандарта Prolog ISO.
Исключение можно выбросить с помощью throw/1
и поймать с catch/3
.
Стандарт ИСО определяет многие случаи, в которых ошибки должны быть или могут быть выброшены. Стандартизованные исключения - это все error(E,_)
формы error(E,_)
, где E
указывает на ошибку. Примерами являются instantiation_error
, domain_error
и type_error
, которые видят.
Важным предикатом в связи с исключениями является setup_call_cleanup/3
, которые видят.
Очистка после исключений
Предикат setup_call_cleanup/3
, который в настоящее время рассматривается для включения в стандарт Prolog ISO и обеспечиваемый растущим числом реализаций, позволяет нам гарантировать, что ресурсы будут правильно освобождены после того, как будет выбрано исключение.
Типичным вызовом является:
setup_call_cleanup(open(File, Mode, Stream), process_file(File), close(Stream))
Обратите внимание, что исключение или прерывание могут возникать сразу же после open/3
в этом случае. По этой причине фаза Setup
выполняется атомарно . В системах Prolog, которые предоставляют только call_cleanup/2
, это намного сложнее выразить.
Ошибки типа и домена
Ошибка типа возникает, если аргумент не относится к ожидаемому типу . Примеры типов:
-
integer
-
atom
-
list
.
Если предикат имеет ожидаемый тип, но вне ожидаемого домена , то возникает ошибка домена .
Например, допустима ошибка домена, если ожидается целое число от 0 до 15, но аргументом является целое число 20.
Декларативно ошибка типа или домена эквивалентна молчащему сбою , поскольку никакое инстанцирование не может сделать предикат, аргумент которого имеет неправильный тип или домен.