Prolog Language
Obsługa błędów i wyjątki
Szukaj…
Błędy instancji
Błąd instancji jest wyrzucane, jeśli argument nie jest dostatecznie instancja.
Krytycznie błąd wystąpienia nie może zostać zastąpiony przez cichą awarię : niepowodzenie w takich przypadkach oznaczałoby brak rozwiązania , podczas gdy błąd wystąpienia oznacza, że wystąpienie argumentu może uczestniczyć w rozwiązaniu.
Jest to w przeciwieństwie do - na przykład - błędu domeny , który można zastąpić cichym niepowodzeniem bez zmiany deklaratywnego znaczenia programu.
Ogólne informacje na temat obsługi błędów
Prolog zawiera wyjątki , które są częścią standardu Prolog ISO.
Wyjątek można rzucić za pomocą throw/1
i złapać za pomocą catch/3
.
Norma ISO określa wiele przypadków, w których błędy muszą lub mogą być zgłaszane. Standaryzowane wyjątki to wszystkie error(E,_)
formularza error(E,_)
, gdzie E
oznacza błąd. Przykładami są instantiation_error
, domain_error
i type_error
, co zobaczyć.
Ważnym predykatem związanym z wyjątkami jest setup_call_cleanup/3
, które widzą.
Sprzątanie po wyjątkach
Predykat setup_call_cleanup/3
, który jest obecnie rozważany pod kątem włączenia do standardu Prolog ISO i zapewniany przez rosnącą liczbę implementacji, pozwala nam zapewnić, że zasoby zostaną poprawnie zwolnione po zgłoszeniu wyjątku.
Typowe wywołanie to:
setup_call_cleanup(open(File, Mode, Stream), process_file(File), close(Stream))
Zauważ, że wyjątek lub przerwanie może nawet wystąpić natychmiast po wywołaniu open/3
w tym przypadku. Z tego powodu faza Setup
jest przeprowadzana atomowo . W systemach Prolog, które zapewniają tylko call_cleanup/2
, jest to o wiele trudniejsze do wyrażenia.
Błędy typu i domeny
Błąd typu występuje, jeśli argument nie jest oczekiwanego typu . Przykłady typów to:
-
integer
-
atom
-
list
.
Jeśli predykat jest oczekiwanego typu, ale znajduje się poza oczekiwaną domeną , wówczas zgłaszany jest błąd domeny .
Na przykład błąd domeny jest dopuszczalny, jeśli oczekiwana jest liczba całkowita od 0 do 15, ale argumentem jest liczba całkowita 20.
Deklaracyjnie błąd typu lub domeny jest równoznaczny z cichym niepowodzeniem , ponieważ żadna instancja nie może uczynić predykatu, którego argument jest niepoprawnym typem lub domeną.