例外処理をやるためにhandleとbracketがある。
Prelude> :m +Control.OldException
Prelude Control.OldException> :t handle
handle :: (Exception -> IO a) -> IO a -> IO a
Prelude Control.OldException> :t bracket
bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
handleは最初の引数に処理が失敗した時の例外ハンドラ。本ではファイルのサイズを返す関数を書くときに使っていて、openに失敗したらNothingを返すようなアクションを定義してた。
bracketは最初のアクションでリソース獲得、二番目のアクションがリソース開放、最後のアクションがリソース獲得から開放までにはしるアクション。pythonでいうところのtry-except-finallyみたいなものか。
RWHではhandleとbracketを組み合わせて
getFileSize path = handle (\_ -> return Nothing) $
bracket (openFile path ReadMode) hClose $ \h -> do
size <- hFileSize h
return (Just size)
ってなってんだけど、もしhandleなしでbracketのopenが失敗して例外が返ったらどうなんのとか?基本的にhandleとbracketは組み合わせて使うものなのか?
Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。