2017-04-13 12 views
2

IO String関数ですべての例外をキャッチしたい。私はこのコードを実行すると:Haskellの()とは異なるIOで例外をキャッチできないのはなぜですか?

import Control.Exception.Base 

handler :: SomeException -> IO String 
handler _ = return "Gotta catch'em all!" 

boom :: IO String 
boom = return (show (3 `div` 0)) 

get :: IO String 
get = boom `catch` handler 

main :: IO() 
main = do 
    x <- get 
    print x 

を私は

exctest: divide by zero 

を取得しかし、このコードは動作します:

import Control.Exception.Base 

handler2 :: SomeException -> IO() 
handler2 _ = print "Gotta catch'em all!" 

boom2 :: IO() 
boom2 = print $ show (3 `div` 0) 

main :: IO() 
main = do 
    boom2 `catch` handler2 

結果

> Gotta catch'em all! 

で、私は最初の例ではブームを変更した場合〜

boom = error "ERR" 

例外はありません。なぜこのように振る舞うのですか?最初の例で例外をキャッチするにはどうすればよいですか?

答えて

8

これは、()と他のタイプとは関係ありません。以下もキャッチしていないことに注意してください:

boom = return $ error "ERR" 

catchはそのことについて何もしません理由returnはあなたがにしようとした場合にのみ、このようにエラーが実際にcatchによってトリガされていない、怠け者であるということです含まれる値を取得します。

Exceptionモジュールがevaluateを持っているのは、正確にはreturnに相当するが厳密な理由によるものです。

boom :: IO String 
boom = evaluate . show $ 3`div`0 
関連する問題