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 _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell