2006-06-13
■ [例外][lib][network] bracketの例 : HAppSより
を偶々読んでいて知りました。これは実装に標準のNetwork.Socketを使っているぽい。
http://happs.org/HAppS/src/HAppS/Protocols/SMTP.hs からの例:
hostSend :: HostName -> Int -> Envelope String -> IO ()
hostSend host portNum msg = bracket (connectTo host (PortNumber $ fromIntegral portNum))
(\h -> hClose h `E.catch` (\_ -> return ()))
(flip handleSend msg)
handleSend :: Handle -> Envelope String -> IO ()
connectToで接続したらhandleSendを実行する。bracketにより、handleSendが失敗するしないに関わらず、hCloseによりハンドルは正しく閉じられる。hCloseの例外処理は書いておく必要がある。 Javaのfinallyブロック内で例外が投げられうるのと同じ。
コメント