即使引發異常,也要處理系統資源

即使治療引發異常,也可以使用高階函式來確保處理系統資源。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 庫。