OCaml try .. with不提供finally像Java这样的子句.但是,这将是有用的,特别是在处理副作用时.例如,我想打开一个文件,将打开的文件传递给一个函数,然后关闭它.如果函数引发异常,我必须抓住它以便有机会关闭文件.当打开多个文件并且打开自身也可能失败时,这变得越来越复杂.是否有一个既定的编程模式来处理这个问题?
下面是一个说明问题的简单函数.f如果path提供了a,则将函数应用于属于文件的通道stdin.因为没有finally子句,所以close_in io出现两次.
let process f = function
| Some path ->
let io = open_in path in
( (try f io with exn -> close_in io; raise exn)
; close_in io
)
| None -> f stdin
Run Code Online (Sandbox Code Playgroud)