Эмуляция try -с помощью -finally в OCaml

В 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
7
задан Christian Lindig 30 June 2012 в 19:23
поделиться