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