module Control.Monad.CatchIO.Old ( MonadCatchIO(..),
E.Exception(..),
throw,
throwDyn, catchDyn,
try, tryJust )
where
#if __BASE_VERSION__ == 3
import qualified Control.Exception as E
#else
import qualified Control.OldException as E
#endif
import Prelude hiding ( catch )
import Data.Dynamic
import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Error
import Control.Monad.Writer
import Control.Monad.RWS
class MonadIO m => MonadCatchIO m where
catch :: m a -> (E.Exception -> m a) -> m a
block :: m a -> m a
unblock :: m a -> m a
throw :: MonadCatchIO m => E.Exception -> m a
try :: MonadCatchIO m => m a -> m (Either E.Exception a)
tryJust :: MonadCatchIO m => (E.Exception -> Maybe b) -> m a -> m (Either b a)
#include "../generic-code.inc"
throwDyn :: Typeable e => e -> b
throwDyn = E.throw . E.DynException . toDyn
catchDyn :: (Typeable e, MonadCatchIO m) => m a -> (e -> m a) -> m a
catchDyn a f = a `catch` handler
where handler e = case e of
E.DynException dyn -> case fromDynamic dyn of
Just exception -> f exception
Nothing -> E.throw e
_ -> E.throw e