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

为什么尽管在prolog中使用了catch,但仍然会引发异常?,prolog,iso-prolog,Prolog,Iso Prolog,使用此代码时引发此异常,但未返回失败: 在Sicstus Polog中: 数字\ U代码/2中的语法错误 ! 数字语法 ! 第0行 在SWI序言中: 错误:数字字符/2:语法错误:非法数字 number_codes(Number,"m"), catch(number_codes(Number,List),error(syntax_error(_),_), fail). 如何使该异常返回失败。这应该是“放弃”异常的正确语法 ?- catch(number_codes(X,"m"),_,true

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

在Sicstus Polog中:

数字\ U代码/2中的语法错误 ! 数字语法 ! 第0行

在SWI序言中:

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

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

如何使该异常返回失败。

这应该是“放弃”异常的正确语法

?- 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中测试…

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

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


永远不要简单地抓住一切(正如@capelical)所建议的那样。以这种方式,您可能会无意中隐藏一些意外错误。

我从未使用过
catch
,但根据这里的文档,它是一个类似于调用的元谓词,因此您不需要提前调用数字代码。我想您误读了我的答案。我清楚地指出,显示的语法旨在放弃异常。或者你认为这是不合法的?@capelical:我们同意你写的。但正是这种“一网打尽”的做法是错误的永久来源:可能不仅有语法错误,还有其他错误。想一想输入错误的列表。