Prolog如何将load_files/1等谓词的错误输出重定向为返回值
解决方案
你可以直接使用ISO Prolog标准定义的catch/3谓词封装你对原有业务流程的调用,不需要修改流程深处的load_files/1逻辑,就能捕获抛出的错误转为可处理的返回值,同时还可按需屏蔽默认的标准输出错误打印。
基础用法示例
% 封装调用的自定义谓词 safe_load_file(FileName, Result) :- catch( % 正常执行分支:加载成功则返回success标记 (load_files(FileName), Result = success), % 匹配捕获到的错误项 ErrorTerm, % 错误分支:将错误项包装为返回值 (Result = error(ErrorTerm)) ).
该实现的效果如下:
- 文件加载成功时,
Result返回success - 出现加载错误时,
Result返回完整错误结构,比如error(existence_error(source_sink,'/home/foo/nothinghere.txt'),_3724),你可以直接对该结构做模式匹配处理不同类型的错误。
屏蔽默认错误打印的实现
如果需要禁止默认的错误信息输出到标准输出/标准错误,可以在调用前后临时重定向流:
safe_load_file_suppress_output(FileName, Result) :- % 保存原始标准错误流 stream_property(Stderr, alias(user_error)), open_null_stream(NullStream), set_stream(NullStream, alias(user_error)), catch( (load_files(FileName), Result = success), ErrorTerm, Result = error(ErrorTerm) ), % 恢复原始标准错误流 set_stream(Stderr, alias(user_error)), close(NullStream).
错误处理示例
拿到返回的结果后可以直接分支处理不同场景:
process_load_result(success) :- writeln("文件加载成功"). process_load_result(error(existence_error(source_sink, Path), _)) :- format("加载失败,文件不存在:~w~n", [Path]). process_load_result(error(ErrorType, _)) :- format("加载失败,其他错误:~w~n", [ErrorType]).
内容的提问来源于stack exchange,提问作者Jere
相关产品推荐
相关产品推荐

