Ocaml 打开输入通道的异常处理

问题描述 投票:0回答:2

作为 Ocaml 的初学者,我有以下当前工作代码:

...
let ch_in = open_in input_file in
try
    proc_lines ch_in
with End_of_file -> close_in ch_in;;

现在我想为不存在的输入文件添加错误处理,我写了这个:

let ch_in = try Some (open_in input_file) with _ -> None in
match ch_in with
| Some x -> try proc_lines x with End_of_file -> close_in x
| None -> () ;;

并收到错误消息:

This pattern matches values of type 'a option
but is here used to match values of type exn

最后一行。如果我用

None
替换
_
,我会收到有关不完整匹配的错误。

我读到

exn
是异常类型。我确信我不明白这里到底发生了什么,所以请给我指出正确的方向。

exception pattern-matching ocaml matching
2个回答
7
投票

当在其他模式匹配中嵌入模式匹配时,您需要用

( ... )
begin ... end
(括号的语法糖)将嵌入的匹配括起来:

let ch_in = try Some (open_in input_file) with _ -> None in
match ch_in with
| Some x -> (try proc_lines x with End_of_file -> close_in x)
| None -> () ;;

0
投票

后期添加,但这可能更好地用处理不同异常的单个

try
来表达。

try
  let ch_in = open_in input_file in
  proc_lines ch_in
with
| Sys_error _ -> ()
| End_of_file -> close_in ch_in
© www.soinside.com 2019 - 2024. All rights reserved.