如何在Picat中捕获solve调用的执行失败错误?
解决Picat中solve无解时的失败捕获问题
你遇到的问题核心是:solve无解导致的是谓词正常失败,而非主动抛出的异常,因此catch/3无法捕获这种情况——catch/3仅用于处理代码主动抛出(如throw/1)或内置谓词抛出的异常,而不是谓词的失败流程。你看到的*** error(failed,main/0)是Picat顶层解释器在main谓词执行失败时输出的提示,并非执行过程中抛出的异常。
以下是几种可行的解决方式:
方法一:用条件判断处理失败
直接检查目标谓词是否执行成功,失败时执行自定义逻辑:
import sat. main => if unsatisfiable then % 有解时可添加处理逻辑 true else printf("Failed\n") end. unsatisfiable => {A,B} :: 1..2, A+B #= 1, solve({A,B}).
方法二:使用on_failure/2专门处理失败
Picat提供了on_failure/2谓词,专门用于在目标谓词失败时执行指定逻辑:
import sat. main => on_failure(unsatisfiable, printf("Failed\n")). unsatisfiable => {A,B} :: 1..2, A+B #= 1, solve({A,B}).
方法三:主动抛出异常让catch捕获
如果一定要用catch/3,可以在目标谓词失败时主动抛出异常,这样就能被catch捕获:
import sat. main => catch(unsatisfiable, _E, handler(_E)). handler(_) => printf("Failed\n"). unsatisfiable => {A,B} :: 1..2, A+B #= 1, % 当solve失败时主动抛出异常 (solve({A,B}) -> true ; throw(failed)).
内容的提问来源于stack exchange,提问作者Bubbler
相关产品推荐
相关产品推荐

