Распространение сообщений об ошибках клипов в PyClips
Я нахожу это очень трудным для разработки с PyClips, потому что он, кажется, заменяет полезные сообщения об ошибках, выдаваемые Clips, общим сообщением об ошибке синтаксиса. Это делает отладку очень трудоемкой и практически невозможной на больших кодовых базах при использовании PyClips.
Рассмотрим следующий пример. Я написал очень большое выражение, которое содержало оператор умножения, но я по ошибке забыл добавить второй аргумент. Вместо того, чтобы просто сказать, что я пропустил аргумент, PyClips сказал мне, что произошла синтаксическая ошибка. То, что должно было занять 1 секунду, чтобы исправить, заняло 5 минут, чтобы исправить, когда я искал свое большое выражение лица, ища ошибку.
Вот сокращенная версия:
В клипах с полезным сообщением об ошибке:
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))
И в PyClips, с ненужным сообщением об ошибке:
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
Как я могу получить PyClips, чтобы дать мне реальную ошибку, выданную Clips?
1 ответ
Поймайте ClipsError, затем прочитайте ErrorStream для подробностей. Например:
engine = clips.Environment()
engine.Reset()
engine.Clear()
try:
engine.Load(os.path.abspath(rule_file))
except clips.ClipsError:
logging.error(clips.ErrorStream.Read())