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.