2011-10-13 2 views
1

Tâche: Intégrer ECL Lisp dans mon projet, la gestion des erreurs de configuration et les rapports d'erreur détaillé (où a eu lieu, type d'erreur, etc.)manutention intégrée erreur ECL Lisp

j'ai essayé de le faire de telle manière:

cl_def_c_function_va(
    c_string_to_object("SYSTEM:UNIVERSAL-ERROR-HANDLER"), 
    LispErrorHandler); 

ECL ont aucune documentation sur son API intégré et aucune documentation sur la gestion des erreurs ...

Pouvez-vous suggérer comment implémenter cela?

+0

S'il vous plaît, tout le monde! –

Répondre

5

Il n'y a pas de gestionnaire d'erreur global car il ne s'agit pas de la philosophie Common Lisp. Si vous voulez gérer les erreurs, faites-le de manière lisp.

1) Créez une fonction qui utilise HANDLER-CASE ou HANDLER-BIND pour configurer les gestionnaires d'erreur appropriés et détecter les erreurs autour d'un formulaire à évaluer. Quelque chose comme

(DEFUN MY-EVAL (FORM) (HANDLER-CASE (EVAL FORM) (ERREUR (C) ...) (MY-ERROR (C) ...) ...)

Cette fonction peut être définie dans votre code C et invoquée.

2) Utilisez les fonctions créées par ECL pour détecter toutes les erreurs. Le plus important est si_safe_eval (form, environment, error_value). Il évalue le LIS lisp dans un ENVIRONNEMENT (typiquement Cnil) et retourne sa sortie ou ERROR_VALUE s'il a une erreur.

Quelques exemples qui utilisent l'une ou l'autre technique: http://thread.gmane.org/gmane.lisp.ecl.general/5365 (2ème message) http://thread.gmane.org/gmane.lisp.ecl.general/8526/focus=8529

+0

Merci beaucoup, Juanjo! J'ai utilisé la 1ère solution ... –

+0

... Mais essayons d'évaluer '(système de defun: UNIVERSAL-ERROR-HANDLER (a1 a2 a3) t)' puis '(qwertyuiop)', le message d'erreur impliquait que la fonction existe (1) et peut être codé/modifié (2). Vous êtes sûr que nous ne pouvons pas l'utiliser? Ce n'est pas un «ennui», mais un intérêt «scientifique», vous ne pouvez pas répondre, si vous ne voulez pas;) Merci encore! –

+1

système: universal-error-handler ne doit pas être mélangé, s'il vous plaît. Si vous souhaitez modifier le gestionnaire d'erreurs, utilisez la norme Common Lisp. Cette fonction existe uniquement à des fins internes et vous essayez de deviner qu'elle peut être surchargée lorsqu'elle ne le peut pas. Il est utilisé en interne par SIGNAL de Common Lisp d'une manière qui ne doit pas être exposée à l'utilisateur. Intercepter ne fait pas disparaître les erreurs - un traitement correct des erreurs est attendu partout dans ECL. Que se passe-t-il si vous remplacez cette fonction et évaluez (SIN "Hello")? – Juanjo