即使引发异常,也要处理系统资源

即使治疗引发异常,也可以使用高阶函数来确保处理系统资源。with_output_file 使用的模式允许清晰地分离关注点:高阶 with_output_file 函数负责管理绑定到文件操作的系统资源,而处理 f 仅消耗输出通道。

let with_output_file path f =
  let c = open_out path in
  try
    let answer = f c in
    (close_out c; answer)
  with exn -> (close_out c; raise exn)

让我们使用这个高阶函数来实现一个将字符串写入文件的函数:

let save_string path s =
  (with_output_file path) (fun c -> output_string c s)

使用比 fun c -> output_string c s 更高级的功能,可以保存更复杂的值。例如,参见标准库中的 Marshal 模块或 Martin Jambon 的 Yojson 库。