
How am I supposed to write an exception handle for an invocation of System.IO.SaferFileHandles.openFile? Currently, I have got this: case req of Open path -> do handle <-openFile (asAbsPath path) ReadMode liftIO $ forcePut result Success run handle Follwing safer-file-handling-examples, I rewrote it to: case req of Open path -> do (do runRegionT $ do handle <-openFile (asAbsPath path) ReadMode liftIO $ forcePut result Success run handle) `catch` \(e :: IOException) -> do liftIO $ forcePut result $ Failure $ show e (I would rather like to apply the handler to the openFile invocation only, but the above matches the example code more closely.) But this gives me a nice error message: Handles.hs:48:17: Could not deduce (Control.Monad.CatchIO.MonadCatchIO (RegionT s IO)) from the context () arising from a use of `catch' at Handles.hs:(48,17)-(54,50) Possible fix: add (Control.Monad.CatchIO.MonadCatchIO (RegionT s IO)) to the context of the polymorphic type `forall s. RegionT s pr α' or add an instance declaration for (Control.Monad.CatchIO.MonadCatchIO (RegionT s IO)) In the expression: do { (do { runRegionT $ do { handle <- openFile (asAbsPath path) ReadMode; .... } }) } `catch` \ (e :: IOException) -> do { liftIO $ forcePut result $ Failure $ show e } In a case alternative: Open path -> do { (do { runRegionT $ do { ... } }) } `catch` \ (e :: IOException) -> do { liftIO $ forcePut result $ Failure $ show e } In the expression: case req of { Open path -> do { (do { runRegionT $ ... }) } `catch` \ (e :: IOException) -> do { ... } Close -> return () _ -> liftIO $ forcePut result $ Failure "handle not open" } safer-file-handling-examples results in similar error messages, after applying the s/runTopRegion/runRegionT/ fix. This is with GHC 6.12.1, with ScopedTypeVariables enabled.