On 24 June 2004 11:54, MR K P SCHUPKE wrote:
With reference to "mapException", I thought this seemed a good idea. I like the 'AnnotatedException' idea... this is much better than concatenating strings... However for not I thought I would test it as is, but it doesn't work as I thought - perhaps someone could point out where I have gone wrong.
1) this works:
main :: IO () main = do a <- getLine hPutStrLn $ showInt (fst . head . readDec $ a :: Int) `Exception.catch` (\e -> throw $ ErrorCall $ showString "Urk :" $ show e)
2) this doesn't work:
main :: IO () main = mapException (\x -> ErrorCall $ showString "Urk :" $ show x) $ do a <- getLine hPutStrLn $ showInt (fst . head . readDec $ a :: Int)
This is due to the nature of exceptions in Haskell. Evaluating the expression (do a <- getLine; hPutStrLn ...) does not do any IO, and it doesn't raise any exceptions, so the mapException doesn't get to annotate any exceptions. What you really wanted here was (untested) mapExceptionIO :: IO a -> (Exception -> Exception) -> IO a mapExceptionIO io f = catch io (\e -> throwIO (f e)) probably we should have this in Control.Exception too. Cheers, Simon