Recherche…


Erreurs d'instanciation

Une erreur d' instanciation est lancée si un argument n'est pas suffisamment instancié .

De manière critique, une erreur d’instanciation ne peut pas être remplacée par une défaillance silencieuse : en cas d’ absence de solution , cela signifie qu’il n’ya pas de solution , alors qu’une erreur d’instanciation signifie qu’une instance de l’argument peut participer à une solution.

Cela contraste avec, par exemple , une erreur de domaine , qui peut être remplacée par une défaillance silencieuse sans modifier le sens déclaratif d'un programme.

Points généraux sur la gestion des erreurs

Prolog propose des exceptions , qui font partie de la norme ISO Prolog.

Une exception peut être lancée avec throw/1 et prise avec catch/3 .

La norme ISO définit de nombreux cas dans lesquels des erreurs doivent ou peuvent être émises. Les exceptions standardisées sont toutes des error(E,_) formulaire error(E,_) , où E indique l'erreur. Les exemples sont instantiation_error , domain_error et type_error , qui voient.

setup_call_cleanup/3 est un prédicat important en relation avec les exceptions.

Nettoyage après exceptions

Le prédicat setup_call_cleanup/3 , dont l'inclusion dans la norme ISO Prolog est en cours et fourni par un nombre croissant d'implémentations, nous permet de nous assurer que les ressources sont correctement libérées après la levée d'une exception.

Une invocation typique est:

setup_call_cleanup(open(File, Mode, Stream), process_file(File), close(Stream))

Notez qu'une exception ou une interruption peut même se produire immédiatement après l'appel de open/3 dans ce cas. Pour cette raison, la phase d' Setup est effectuée de manière atomique . Dans les systèmes Prolog qui ne fournissent que call_cleanup/2 , cela est beaucoup plus difficile à exprimer.

Erreurs de type et de domaine

Une erreur de type se produit si un argument n'est pas du type attendu. Des exemples de types sont:

  • integer
  • atom
  • list .

Si le prédicat est du type attendu, mais en dehors du domaine attendu, une erreur de domaine est générée.

Par exemple, une erreur de domaine est admissible si un nombre entier compris entre 0 et 15 est attendu, mais l'argument est le nombre entier 20.

Déclarativement, une erreur de type ou de domaine équivaut à une défaillance silencieuse , car aucune instanciation ne peut aboutir à un prédicat dont l'argument est du type ou du domaine incorrect.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow