Prolog Language
Foutafhandeling en uitzonderingen
Zoeken…
Instantiefouten
Er wordt een instantatiefout gegenereerd als een argument niet voldoende wordt geïnstantieerd .
Van cruciaal belang is dat een instantatiefout niet kan worden vervangen door stille fout : in dergelijke gevallen zou falen betekenen dat er geen oplossing is , terwijl een instantatiefout betekent dat een instantie van het argument kan deelnemen aan een oplossing.
Dit in tegenstelling tot bijvoorbeeld-domein fout, die door stille mislukking kan worden vervangen zonder dat de declaratieve betekenis van een programma.
Algemene punten over foutafhandeling
Prolog biedt uitzonderingen , die deel uitmaken van de Prolog ISO-norm.
Een uitzondering kan worden gegooid met throw/1
en gevangen met catch/3
.
De ISO-norm definieert veel gevallen waarin fouten moeten of kunnen worden geworpen. De gestandaardiseerde uitzonderingen zijn allemaal de error(E,_)
, waarbij E
de fout aangeeft. Voorbeelden zijn instantiation_error
, domain_error
en type_error
, die zien.
Een belangrijk predicaat in verband met uitzonderingen is setup_call_cleanup/3
, die zien.
Opruimen na uitzonderingen
Het predicaat setup_call_cleanup/3
, dat momenteel wordt overwogen voor opname in de Prolog ISO-standaard en wordt geleverd door een toenemend aantal implementaties, laat ons ervoor zorgen dat middelen correct worden vrijgemaakt nadat een uitzondering is gegenereerd.
Een typische aanroep is:
setup_call_cleanup(open(File, Mode, Stream), process_file(File), close(Stream))
Merk op dat in dit geval zelfs een uitzondering of onderbreking kan optreden nadat open/3
wordt aangeroepen. Om deze reden wordt de Setup
fase atomair uitgevoerd. In Prolog-systemen die alleen call_cleanup/2
, is dit veel moeilijker uit te drukken.
Type- en domeinfouten
Een type fout treedt op als een argument is niet van de verwachte type. Voorbeelden van typen zijn:
-
integer
-
atom
-
list
.
Als het predicaat van het verwachte type is, maar buiten het verwachte domein , wordt een domeinfout gegenereerd.
Een domeinfout is bijvoorbeeld toegestaan als een geheel getal tussen 0 en 15 wordt verwacht, maar het argument is het gehele getal 20.
Declaratief is dat een type- of domeinfout gelijk is aan stille mislukking , omdat geen enkele instantiatie een predicaat kan doen wiens argument van het verkeerde type of domein is.