Functional programming 在try/with块中打印消息,而不在Ocaml中返回值

Functional programming 在try/with块中打印消息,而不在Ocaml中返回值,functional-programming,ocaml,Functional Programming,Ocaml,我正在用OCaml为一个基本的说教式解释器编写一个测试单元,因此我有返回有效表达值(evT)的测试和简单失败的测试,以及“抛出”failwith(“某物”)语句的测试 如果我编译并运行该文件,显然在第一次失败时程序就会终止。所以我使用try/with块来防止这种情况发生,并继续测试过程。我只想打印错误消息而不返回任何值,但它继续说,期望的是一个表达式值而不是一个单位 下面是我的代码片段: try eval (Dict([("",Eint(30));("mele",Eint(40))]))

我正在用OCaml为一个基本的说教式解释器编写一个测试单元,因此我有返回有效表达值(evT)的测试和简单失败的测试,以及“抛出”failwith(“某物”)语句的测试

如果我编译并运行该文件,显然在第一次失败时程序就会终止。所以我使用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

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

let _ : evT = eval (Dict([("",Eint(30));("mele",Eint(40))])) myEnv in ()
但是你到底在测试什么呢?只是它不会扔?你不也应该检查一下结果是否正确吗


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

我不需要eval函数返回的值,但我只想检查一下,如果输入正确,它是否会抛出错误。但是,即使使用您的解决方案,程序在遇到线路时仍会崩溃。然后,您似乎没有捕获正确的异常。嗯,我不明白重点。我只想做一些类似于
的事情,尝试一些catch print(“message”)
,然后继续进行其他测试。您可以使用通配符模式
\uu
来捕获所有异常,而不是
Failure(msg)
。“行”应该在try内,而不是在它周围:
try let\uv=。。。在()中出现故障(msg)->Printf.Printf“%s”msg
。一个可能更好的方法是
try-let u:evT=。。。在TestFailure(“评估未引发异常”)中,包含Failure(msg)->TestSuccess