Python pyAIML异常处理问题:输入非匹配模式时Except未触发
解决pyAIML未匹配模式时except块不触发的问题
首先得明确问题的核心:pyAIML的Kernel.respond()方法在找不到匹配模式时,并不会抛出异常——它只会返回一个预设的默认回复(不同版本的pyAIML默认回复可能不一样,比如有的是"I don't understand.",有的是空字符串),所以你原来的try-except逻辑根本不会触发,这就是为什么输入"WRONG"时没看到"NOT FOUND"的原因。
另外先提一下你代码里的两个小问题:
input.("ASK?")是语法错误,应该写成input("ASK? ")if text == text:这个判断完全多余,因为它永远为真,可以直接删掉
接下来给你两种可行的解决方案:
方案1:检测默认回复
先获取库自带的默认回复内容,然后判断respond()的返回值是否等于这个默认值,如果是就输出你的提示:
import aiml # 初始化AIML核心 k = aiml.Kernel() # 添加你的匹配规则 k.addPattern("HI", "HI TOO") # 先获取默认回复(输入一个肯定不存在的模式) default_reply = k.respond("__RANDOM_UNKNOWN_INPUT__") # 获取用户输入 user_input = input("ASK? ") bot_reply = k.respond(user_input) # 判断是否匹配到规则 if bot_reply == default_reply: print('NOT FOUND') else: print(bot_reply)
方案2:自定义默认回复
更可靠的方式是自己设置一个唯一的默认回复标识,这样判断起来更准确,不会和正常回复冲突:
import aiml k = aiml.Kernel() # 设置自定义的默认回复(用一个独特的字符串,避免和正常回复重复) k.setPredicate("default-response", "__NO_MATCH_FOUND__") # 添加你的匹配规则 k.addPattern("HI", "HI TOO") user_input = input("ASK? ") bot_reply = k.respond(user_input) if bot_reply == "__NO_MATCH_FOUND__": print('NOT FOUND') else: print(bot_reply)
这两种方案都能解决你的问题,方案2更推荐,因为自定义的默认标识不会和你后续添加的正常回复内容意外重复,稳定性更高。
内容的提问来源于stack exchange,提问作者Ilham Riski
相关产品推荐
相关产品推荐

