blog.anqou.net
rss
author
tags

OCaml の Eio の Io エラーを捕捉する

Eio は、OCaml 5 から追加された effect handler を活用した非同期処理のためのフレームワークです。Eio を介して IO を行う場合、その IO が失敗した場合に注意を払う必要があります。Eio では Eio.Io という例外が定義されており、これを送出することで IO エラーを表現します。これの定義は少し複雑で、捕捉の方法に戸惑うことがあります。

例えば Eio.Path.with_open_in を使うとファイルを開くことができます。この際、ファイルが存在しないと Fs.Not_foundEio.Io に包まれて送出されます。

let () =
    Eio_main.run @@ fun env ->
    try
        Eio.Path.(with_open_in (env#cwd / "foo")) (fun _file -> ())
    with Eio.(Io (Fs.(E (Not_found _)), _)) ->
        print_endline "foo not found"

あるいは Eio.Process.run で外部コマンドを実行できますが、コマンドが存在しない場合は Process.Executable_not_found が送出されます。

let () =
    Eio_main.run @@ fun env ->
    try
        Eio.Process.run env#process_mgr ["foo"]
    with Eio.(Io (Process.(E (Executable_not_found command)), _)) ->
        Printf.eprintf "executable not found: %s\n" command

どのようなエラーがあるかは Eio の GitHub レポジトリで type error = で検索すると一番わかりやすいでしょう。

https://github.com/search?q=repo%3Aocaml-multicore%2Feio+%22type+error+%3D%22&type=code

なお Eio.Io の第二引数には Eio.Exn.context が渡されます。Eio.Exn.pp などを使うときに使われるようです。