为什么尽管在prolog中使用了catch,但仍然会引发异常?
使用此代码时引发此异常,但未返回失败: 在Sicstus Polog中: 数字\ U代码/2中的语法错误 ! 数字语法 ! 第0行 在SWI序言中: 错误:数字字符/2:语法错误:非法数字为什么尽管在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
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:我们同意你写的。但正是这种“一网打尽”的做法是错误的永久来源:可能不仅有语法错误,还有其他错误。想一想输入错误的列表。