为了在简单查询中运行一组查询,我已标记这些查询并使用forall/2
来调用它们:
query_all :-
forall(query(Q), (Q ->
format('yes: ~w~n',[Q]) ;
format('no : ~w~n',[Q]))).
因此,如果我定义query(true).
之类的内容,我将能够从输出中看到yes: true
。
这里的问题是query( ... )
并不总是存在,当prolog找不到标记为query
的任何内容时,forall/2
将失败并导致异常说“错误(exists_error(过程) ,查询/ 1),forall的/ 2)“
我想处理这个异常,但不要破坏整个控制流程。
我知道catch/3会帮助我,但我不知道如何使用它,我的代码是:
catch(query_all, error(existence_error(procedure,_),_), recovery).
recovery :-
format('error occurred.~n',[]).
但是prolog说“本机代码程序catch / 3不能重新定义”。 有没有我错过的东西?
答案 0 :(得分:3)
您可以在代码中将query/1
声明为动态添加此行:
:-dynamic(query/1).
或按照建议使用catch/3
,但是您不必重新定义它,而是使用它,例如:
query_all :-
catch(
forall(query(Q), (Q ->
format('yes: ~w~n',[Q]) ;
format('no : ~w~n',[Q]))),
error(existence_error(procedure, _), _), format('error occurred.~n', [])).