有一些Prolog谓词输出错误消息,如load_files/1
,以防找不到该文件:
error(existence_error(source_sink,'/home/foo/nothinghere.txt'),_3724).
这些错误消息只是打印到stdout,但不作为prolog返回值返回。
在我的例子中,load_files/1
作为我不想修改的过程的一部分而被调用。我只需传递文件名并等待返回值。但据我所知,在这种情况下,返回值要么是True,要么是错误。有什么方法可以让我将错误输出重定向到返回值,这样我才能实际地对我得到的输出做一些事情吗?
发布于 2021-10-15 04:32:27
你可以用catch/3
。
?- catch(load_files('/tmp/exists.prolog'), E, true).
true.
?- catch(load_files('/tmp/notexists.prolog'), E, true).
E = error(existence_error(source_sink, '/tmp/notexists.prolog'), _).
catch(:Goal, +Catcher, :Recover)
用于从:Goal
中捕获throw(_)
。
Catcher
与throw/1
.Recover
的参数是统一的,使用call/1
.调用
在上面的示例中,E
与任何错误都是一致的。我们不想这样,所以我们可以这样做:
catchFileErrors(G, F) :-
catch(G, error(existence_error(source_sink, F), _), true).
?- catchFileErrors(load_files('exists.prolog'), E).
true.
?- catchFileErrors(load_files('notexists.prolog'), E).
E = 'notexists.prolog'.
如果您有要从错误中恢复的策略,则可以传递一个目标作为要捕获的最后一个参数。
https://stackoverflow.com/questions/69584238
复制相似问题