Exception OCaml:对较大的程序使用'try'和'with'

Exception OCaml:对较大的程序使用'try'和'with',exception,ocaml,Exception,Ocaml,假设您有一系列可能引发异常的表达式。如果是这样的话,你需要一个漫长的过程。如果不是这样的话,你希望一个不同的漫长的过程发生。在命令式语言中,您通常可以执行以下操作 try: ... except: ... 但我似乎无法在OCaml中重现这一点,因为似乎一次只能检查一个表达式是否存在异常。我也不知道如何使用这个值,如果它存在,或者如果它不存在,如何做其他事情 举一个更具体的例子:我有一个函数list\u max,如果列表为非空,则返回其最大值;如果列表为空,则引发异常。假设我有一

假设您有一系列可能引发异常的表达式。如果是这样的话,你需要一个漫长的过程。如果不是这样的话,你希望一个不同的漫长的过程发生。在命令式语言中,您通常可以执行以下操作

try:
    ...
except:
    ...
但我似乎无法在OCaml中重现这一点,因为似乎一次只能检查一个表达式是否存在异常。我也不知道如何使用这个值,如果它存在,或者如果它不存在,如何做其他事情

举一个更具体的例子:我有一个函数
list\u max
,如果列表为非空,则返回其最大值;如果列表为空,则引发异常。假设我有一个列表,并想断言它的最大值是4,但我错了,它实际上是一个空列表。从我找到的解释中,我似乎无法正确理解语法。我尝试了以下方法和多种排列方式:

try (list_max [])
with
| Failure s -> -1
| _ -> assert (list_max [] = 4);;
[编辑:与上面的人为示例不同,可能更有意义的示例是:假设我想对这个
list\u max
函数进行单元测试。我知道我能做到

assert ( (list_max [1;2;3] = 3 );;

但是我如何测试
list\u max
是否正确地在空列表上抛出异常?]

您可以在try表达式中执行断言,只要它引发了一个您无法捕获的异常。在这种情况下,任何其他异常(如
Assert\u failure
)都将通过

try assert (list_max [] = 4) with
| Failure s -> -1
但是
assert
返回
unit
,因此在任何情况下这都是一个类型错误

另一种方法是使用:

(这仍然有一个类型错误)

最后,您可能希望使用
选项
结果
类型而不是异常,因为它们更安全。编译器不会让您忘记错误条件。如果
list\u max
返回了一个
选项,这将是:

match list_max [] with
| None -> -1
| Some _ -> assert (list_max [] = 4)

(尽管仍然存在类型错误)

我不理解这个问题。为什么不干脆断言(list_max[]=4)
?你想通过
try
在那里实现什么?@melpomene这会不会引发异常并停止程序?如果我使用命令式语言,我想要的是尝试获取
列表\u max
并对其执行任何操作——但是如果程序抛出和异常,则移动到except块并在那里执行指令。是的,这是
尝试对句柄\u异常\u执行任何操作。我还是不明白这个问题。如果您需要具体的帮助,请告诉我们“那里的说明”应该做什么。@melpomene因此在上面的示例中,假设我想尝试断言列表的最大值是4,但如果它不存在,则返回$-1$。也许还有一个更好的例子,我将在一分钟后编辑到文章中,那就是:您如何对
list\u max
进行单元测试?如果您想测试抛出的异常,为什么不干脆
assert(try(list\u max[];false)失败
。。。这里的所有内容都有一个错误,所以我试图做的事情无法完成?不像您描述的那样,没有。如果断言通过,表达式的计算结果应该是什么?
match list_max [] with
| None -> -1
| Some _ -> assert (list_max [] = 4)