Clips Messages d'erreur de propagation dans PyClips
-
02-10-2019 - |
Question
Je trouve qu'il est très difficile de développer avec PyClips, car il semble remplacer les messages d'erreur utiles lancés par des clips avec un message « erreur de syntaxe » générique. Cela rend le débogage très laborieux et pratiquement impossible sur les grands codebases lors de l'utilisation PyClips.
Prenons l'exemple suivant. J'ai écrit une très grande expression, qui contenait l'opérateur de multiplication, mais j'ai oublié à tort d'ajouter le second argument. Au lieu de dire simplement que je manquais un argument, PyClips m'a dit qu'il y avait une erreur de syntaxe. Ce qui aurait dû me prendre 1 seconde correcte, m'a pris 5 minutes pour corriger comme je l'ai pourchassé par ma grande expression, à la recherche de l'erreur.
Voici une version condensée:
Dans des clips, avec un message d'erreur utile:
clips
CLIPS> (defrule myrule "" (myfact 123) => (bind ?prob (* (min 1 2))))
[ARGACCES4] Function * expected at least 2 argument(s)
ERROR:
(defrule MAIN::myrule ""
(myfact 123)
=>
(bind ?prob (* (min 1 2))
Et en PyClips, avec un message d'erreur unuseful:
python
>>> import clips
>>> clips.BuildRule('myrule','(myfact 123)','(bind ?prob (* (min 1 2)))','')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/clips/_clips_wrap.py", line 2839, in BuildRule
_c.build(construct)
_clips.ClipsError: C08: syntax error, or unable to parse expression
Comment puis-je obtenir PyClips pour me donner la réel erreur émise par des clips?
La solution
Catch the ClipsError, puis lisez fluxErreur pour les détails. Par exemple:
engine = clips.Environment()
engine.Reset()
engine.Clear()
try:
engine.Load(os.path.abspath(rule_file))
except clips.ClipsError:
logging.error(clips.ErrorStream.Read())