Exception Handling on GHandler monad level

Hi Michael, i need to handle exception on GHandler monad level. We have: *type GHandler sub master = GGHandlerhttp://hackage.haskell.org/packages/archive/yesod-core/0.8.1/doc/html/Yesod-... sub master (Iterateehttp://hackage.haskell.org/packages/archive/enumerator/0.4.10/doc/html/Data-... ByteStringhttp://hackage.haskell.org/packages/archive/bytestring/0.9.1.10/doc/html/Dat... IOhttp://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-IO.... **)* * *data GGHandler sub master m a ... MonadControlIOhttp://hackage.haskell.org/packages/archive/monad-control/0.2.0.1/doc/html/C... m => MonadControlIOhttp://hackage.haskell.org/packages/archive/monad-control/0.2.0.1/doc/html/C... (GGHandlerhttp://hackage.haskell.org/packages/archive/yesod-core/0.8.1/doc/html/Yesod-... sub master m) *(Iterateehttp://hackage.haskell.org/packages/archive/enumerator/0.4.10/doc/html/Data-... ByteStringhttp://hackage.haskell.org/packages/archive/bytestring/0.9.1.10/doc/html/Dat... IOhttp://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-IO.... **) have no instance of * MonadControlIOhttp://hackage.haskell.org/packages/archive/monad-control/0.2.0.1/doc/html/C... thus we got error: No instance for (MonadControlIO (Data.Enumerator.Iteratee Data.ByteString.Internal.ByteString IO)) arising from a use of `E.catch' Possible fix: add an instance declaration for (MonadControlIO (Data.Enumerator.Iteratee Data.ByteString.Internal.ByteString IO)) i need something like: * * *function :: Handler (Maybe Int)* *function = do * * res <- E.catch (runDB $ do * * action1* * action2* * ... * * return 1* * )* * (\(e :: E.SomeException) -> return 0)* How i can get this ? Thanks. -- Best regards, Cheshkov Anton Phone: +7 909 005 18 82 Skype: cheshkov_anton

You want to use liftIOHandler[1]. You should be able to just do:
function = liftIOHandler $ do ...
However, given that you want to call runDB, which *already* has a call to
liftIOHandler, I'd recommend you take the code from runDB and modify it.
Michael
[1]
http://hackage.haskell.org/packages/archive/yesod-core/0.8.1/doc/html/Yesod-...
On Tue, May 17, 2011 at 3:04 PM, Anton Cheshkov
Hi Michael,
i need to handle exception on GHandler monad level.
We have:
*type GHandler sub master = GGHandlerhttp://hackage.haskell.org/packages/archive/yesod-core/0.8.1/doc/html/Yesod-... sub master (Iterateehttp://hackage.haskell.org/packages/archive/enumerator/0.4.10/doc/html/Data-... ByteStringhttp://hackage.haskell.org/packages/archive/bytestring/0.9.1.10/doc/html/Dat... IOhttp://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-IO.... **)* * *data GGHandler sub master m a ... MonadControlIOhttp://hackage.haskell.org/packages/archive/monad-control/0.2.0.1/doc/html/C... m => MonadControlIOhttp://hackage.haskell.org/packages/archive/monad-control/0.2.0.1/doc/html/C... (GGHandlerhttp://hackage.haskell.org/packages/archive/yesod-core/0.8.1/doc/html/Yesod-... sub master m)
*(Iterateehttp://hackage.haskell.org/packages/archive/enumerator/0.4.10/doc/html/Data-... ByteStringhttp://hackage.haskell.org/packages/archive/bytestring/0.9.1.10/doc/html/Dat... IOhttp://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-IO.... **) have no instance of * MonadControlIOhttp://hackage.haskell.org/packages/archive/monad-control/0.2.0.1/doc/html/C... thus we got error:
No instance for (MonadControlIO (Data.Enumerator.Iteratee Data.ByteString.Internal.ByteString IO)) arising from a use of `E.catch' Possible fix: add an instance declaration for (MonadControlIO (Data.Enumerator.Iteratee Data.ByteString.Internal.ByteString IO))
i need something like: * * *function :: Handler (Maybe Int)* *function = do * * res <- E.catch (runDB $ do * * action1* * action2* * ... * * return 1* * )* * (\(e :: E.SomeException) -> return 0)*
How i can get this ?
Thanks.
-- Best regards, Cheshkov Anton Phone: +7 909 005 18 82 Skype: cheshkov_anton
participants (2)
-
Anton Cheshkov
-
Michael Snoyman