鉴于:
fruitid('Apple', 'Granny Smith', 1).
fruitid('Pear', 'Bartlett', 2).
Run Code Online (Sandbox Code Playgroud)
如果我有条款
type_of_fruit(ID):-
fruitid(Fruit, _, ID), write(Fruit).
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现一种方法来捕捉错误的输入?
例如
fruitid(5).
Run Code Online (Sandbox Code Playgroud)
谢谢。
作为
设置 Prolog 标志并使用 Catch/3
假设 SWI Prolog
1) prolog_flags 可以改变错误行为。首先让系统捕获错误并报告。该unknown标志用于未知谓词,例如fruitID/1.
set_prolog_flag(report_error,true).
set_prolog_flag(unknown,error).
Run Code Online (Sandbox Code Playgroud)
现在,当使用了错误的谓词 arity 时,应该会出现这样的错误消息:
?- fruitid(5).
ERROR: toplevel: Undefined procedure: fruitid/1 (DWIM could not correct goal)
Run Code Online (Sandbox Code Playgroud)
2) 要在代码中捕获诸如此类的异常,请将目标包装在 catch/3 谓词中。仍然需要 1) 中的 settigs。这是在代码中捕获未定义谓词或捕获任何异常的方法。将 format/3 替换为所需的处理程序:
while_running_some_program:-
catch(foodid(5),
error(Err,_Context),
format('You done goofed! ~w\n', [Err])),
rest_of_code.
Run Code Online (Sandbox Code Playgroud)