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.
Декларативно ошибка типа или домена эквивалентна молчащему сбою , поскольку никакое инстанцирование не может сделать предикат, аргумент которого имеет неправильный тип или домен.