Prolog Language
Felhantering och undantag
Sök…
Instantiation-fel
Ett instansfel kastas om ett argument inte är tillräckligt instanserat .
Kritiskt sett kan ett inställningsfel inte ersättas med tyst fel : Om man inte lyckas i sådana fall skulle det inte finnas någon lösning , medan ett inställningsfel innebär att en instans av argumentet kan delta i en lösning.
Detta står i kontrast till för exempel-domänen fel, som kan ersättas med tysta fel utan att ändra deklarativ innebörden av ett program.
Allmänna punkter om felhantering
Prolog har undantag som ingår i Prolog ISO-standarden.
Ett undantag kan kastas med throw/1
och fångas med catch/3
.
ISO-standarden definierar många fall där fel måste eller kan kastas. De standardiserade undantagen är alla error(E,_)
, där E
indikerar felet. Exempel är instantiation_error
, domain_error
och type_error
, som se.
Ett viktigt predikat i samband med undantag är setup_call_cleanup/3
, som se.
Städning efter undantag
Predikatet setup_call_cleanup/3
, som för närvarande övervägs för inkludering i Prolog ISO-standarden och tillhandahålls av ett ökande antal implementeringar, låter oss se till att resurser frigörs korrekt efter att ett undantag kastats.
En typisk kallelse är:
setup_call_cleanup(open(File, Mode, Stream), process_file(File), close(Stream))
Observera att ett undantag eller avbrott till och med kan inträffa omedelbart efter att open/3
har kallats i detta fall. Av denna anledning Setup
är fasen utförs atomärt. I Prolog-system som bara ger call_cleanup/2
är detta mycket svårare att uttrycka.
Typ- och domänfel
Ett typfel uppstår om ett argument inte är av den förväntade typen . Exempel på typer är:
-
integer
-
atom
-
list
.
Om predikatet är av den förväntade typen, men utanför den förväntade domänen , tas ett domänfel upp.
Till exempel är ett domänfel tillåtet om ett heltal mellan 0 och 15 förväntas, men argumentet är heltalet 20.
Deklarativt är ett typ- eller domänfel likvärdigt med tyst fel , eftersom ingen instans kan göra ett predikat vars argument är av fel typ eller domän lyckas.