为了在一个简单的查询中运行一组查询,我标记了这些查询并使用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将失败并导致异常说“error(existence_error(procedure,query/1),forall/2)”
我想处理这个异常,但不想破坏整个控制流。
我知道catch/3会帮助我,但我不知道如何使用它,我的代码是:
catch(query_all, error(existence_error(procedure,_),_), recovery).
recovery :-
format('error occurred.~n',[]).
但序言说“不能重新定义本机代码过程 catch/3”。有什么我错过的吗?