Exception 异常模式必须位于匹配案例的顶层

Exception 异常模式必须位于匹配案例的顶层,exception,file-io,pattern-matching,reason,Exception,File Io,Pattern Matching,Reason,这包括: let inputFile = open_in("test.txt"); let line = try(input_line(inputFile)) { | End_of_file => "end of file" }; print_endline(line); 但不是这个: let inputFile = open_in("test.txt"); try(input_line(inputFile)) { | line => print_endline(line) | e

这包括:

let inputFile = open_in("test.txt");
let line = try(input_line(inputFile)) {
| End_of_file => "end of file"
};
print_endline(line);
但不是这个:

let inputFile = open_in("test.txt");
try(input_line(inputFile)) {
| line => print_endline(line)
| exception End_of_file => print_endline("end of file")
};
对于后者,我得到一个错误:“异常模式必须位于匹配案例的顶层”

我很困惑,因为它似乎与文档中的模式相同()

它编译时不会出错

更改匹配案例的顺序或删除“exception”关键字不会更改错误


这个错误意味着什么?我不确定“顶层”是什么意思。

try
用于异常处理,类似于JavaScript中的
try/catch
。在您的例子中,您希望进行模式匹配,并捕获一个异常(reasonml允许),因此您可以只使用
开关

let inputFile = open_in("test.txt");
switch(input_line(inputFile)) {
| line => print_endline(line) 
| exception End_of_file => print_endline("end of file")
};

try
用于异常处理,类似于JavaScript中的
try/catch
。在您的例子中,您希望进行模式匹配,并捕获一个异常(reasonml允许),因此您可以只使用
开关

let inputFile = open_in("test.txt");
switch(input_line(inputFile)) {
| line => print_endline(line) 
| exception End_of_file => print_endline("end of file")
};

你不应该使用
开关
而不是
尝试
?你不应该使用
开关
而不是
尝试
?我认为在设计可能失败的函数时,值得一提的是,最好以sum类型返回值,如
Js.Result
,它具有
Ok
Error
构造函数,因为编译器会提醒您处理这两种情况,而不会提醒您处理异常。然而,OCaml stdlib中的许多函数和许多节点函数都使用异常。我认为值得一提的是,在设计可能在RationalML中失败的函数时,最好以sum类型返回值,如
Js.Result
,它具有
Ok
Error
构造函数,因为编译器会提醒您处理这两种情况,而不会提醒您处理异常。但是,OCaml stdlib中的许多函数和许多节点函数使用异常。