首页 > 解决方案 > 在 try/with 块中打印一条消息,在 Ocaml 中没有返回值

问题描述

我正在为 OCaml 中的基本教学解释器编写一个测试单元,所以我有返回有效表达值 (evT) 的测试和简单失败的测试,并“抛出”一个 failwith(“something”) 语句。

如果我编译并运行该文件,显然在第一次失败时程序终止。所以我使用 try/with 块来防止这种情况发生并继续测试过程。我只想打印错误消息而不返回任何值,但它继续说期望一个表达值而不是一个单位。

这是我的代码片段:

try
    eval (Dict([("",Eint(30));("mele",Eint(40))])) myEnv
with
    Failure(msg) -> Printf.printf "%s" msg
;;

这是输出:

404 |     Failure(msg) -> Printf.printf "%s" msg
                          ^^^^^^^^^^^^^^^^^^^^^^
Error: This expression has type unit but an expression was expected of type
         evT

标签: functional-programmingocaml

解决方案


如果您不需要返回的值,eval则可以忽略它:

let _ : evT = eval (Dict([("",Eint(30));("mele",Eint(40))])) myEnv in ()

但是,您真正测试的是什么?只是它不扔?你不应该也检查结果是否正确吗?

或者,如果您确实需要try块外的值,那么在捕获异常的情况下您也需要一个值,这就是错误消息本质上告诉您的内容。唯一的其他选择是中止程序,我知道你不想要。


推荐阅读