IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

Servantでの例外処理

ファイルの読み込み(基本形で、ここではまだ例外処理を入れていない)

Reading a file in Servant

ファイル読み込みに失敗した時の対処 (catch)

*> :t catch
catch :: Exception e => IO a -> (e -> IO a) -> IO a

catchは、catchした時の対処はできるが、戻りの型はIO aなので、aで正常と異常を区別しなくてはいけない。下の例ではIO Stringなので、Stringで正常と異常を区別することになるが、異常の状態をなにか特別な文字列表現にしなくてはいけない。これは、実質的に、例外の情報を、呼び出し側に教えることができない。

Exception handing by catch in Servant

ファイル読み込みに失敗した時の対処 (try)

tryIO (Either a b)なので、例外の情報をLeftで呼び出し元に教えることができる。

Exception handling by try in Servant

パスより読み込むファイルを指定する

Capturing in Servant