В OCaml try.. with
нет предложения finally
, как в Java. Однако это было бы полезно, особенно при работе с побочными эффектами. Например, мне нравится открывать файл, передавать открытый файл функции и закрывать его. Если функция вызывает исключение, я должен его перехватить, чтобы иметь возможность закрыть файл. Это становится все более сложным, когда открыто несколько файлов, и само открытие также может завершиться ошибкой. Есть ли устоявшийся шаблон программирования для решения этой проблемы?
Ниже приведена простая функция, иллюстрирующая проблему. Функция f
применяется к каналу, который принадлежит файлу, если предоставлен path
, и 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