为什么尽管在prolog中使用catch仍然会引发异常?

时间:2013-11-24 06:17:46

标签: prolog iso-prolog

使用此代码时,引发了此异常并且未返回失败:

在Sicstus Polog中:

number_codes / 2中的语法错误 !数字语法 !在第0行

在SWI-Prolog中:

错误:number_chars / 2:语法错误:非法数字

number_codes(Number,"m"),
catch(number_codes(Number,List),error(syntax_error(_),_), fail). 

如何使此异常返回失败。

2 个答案:

答案 0 :(得分:3)

捕获语法错误的ISO方法是写:

catch(number_codes(Number,"m"),error(syntax_error(_),_), fail).

第一个参数是要保护的目标,第二个参数是要捕获的模式。在这种情况下,您希望捕获错误。错误都是error(E,_)形式,其中第一个参数是具体的错误术语,在本例中为syntax_error(_)。第二个参数是实现定义。所以你不能依赖它的精确格式。

从不只是抓住一切(如@CapelliC建议的那样)。通过这种方式,您可能会无意中隐藏一些意外错误。

答案 1 :(得分:1)

这应该是正确的语法来放弃'

?- catch(number_codes(X,"m"),_,true).
true.

?- catch(number_codes(X,"m"),_,false).
false.

检查错误详情,试试

?- catch(number_codes(X,"m"),error(E,C),(writeln(E:C),false)).
syntax_error(illegal_number):context(number_codes/2,_G12951)
false.

(我在SWI-Prolog中测试过......)

相关问题