在PyClips中传播剪辑错误消息

0 投票
1 回答
597 浏览
提问于 2025-04-16 04:08

我发现用PyClips开发真的很困难,因为它把Clips抛出的有用错误信息替换成了一个通用的“语法错误”提示。这让调试变得非常麻烦,尤其是在处理大型代码时,几乎不可能用PyClips来调试。

举个例子。我写了一个很大的表达式,里面有乘法运算符,但我不小心忘了加第二个参数。PyClips没有直接告诉我缺少参数,而是说有语法错误。原本我只需要花1秒钟就能修正的错误,结果我花了5分钟在我的大表达式里找错。

这里有一个简化的版本:

在Clips中,有用的错误信息是:

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 个回答

0

捕捉到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())

撰写回答