-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Extensible optionally-pure exceptions -- -- Extensible optionally-pure exceptions @package exceptions @version 0.1 -- | This module supports monads that can throw extensible exceptions. The -- exceptions are the very same from Control.Exception, and the -- operations offered very similar, but here they are not limited to -- IO. -- -- This code is in the style of both transformers and mtl, and is -- compatible with them, though doesn't mimic the module structure or -- offer the complete range of features in those packages. -- -- This is very similar to ErrorT and MonadError, but -- based on features of Control.Exception. In particular, it -- handles the complex case of asynchronous exceptions by including -- mask in the typeclass. Note that the extensible extensions -- feature relies the RankNTypes language extension. module Control.Monad.Catch class Monad m => MonadCatch m throwM :: (MonadCatch m, Exception e) => e -> m a catch :: (MonadCatch m, Exception e) => m a -> (e -> m a) -> m a mask :: MonadCatch m => ((forall a. m a -> m a) -> m b) -> m b -- | Add Exception handling abilities to a Monad. newtype CatchT m a CatchT :: m (Either SomeException a) -> CatchT m a runCatchT :: CatchT m a -> m (Either SomeException a) type Catch = CatchT Identity runCatch :: Catch a -> Either SomeException a -- | Map the unwrapped computation using the given function. -- --
-- data MyException = ThisException | ThatException -- deriving (Show, Typeable) -- -- instance Exception MyException ---- -- The default method definitions in the Exception class do what -- we need in this case. You can now throw and catch -- ThisException and ThatException as exceptions: -- --
-- *Main> throw ThisException `catch` \e -> putStrLn ("Caught " ++ show (e :: MyException))
-- Caught ThisException
--
--
-- In more complicated examples, you may wish to define a whole hierarchy
-- of exceptions:
--
-- -- --------------------------------------------------------------------- -- -- Make the root exception type for all the exceptions in a compiler -- -- data SomeCompilerException = forall e . Exception e => SomeCompilerException e -- deriving Typeable -- -- instance Show SomeCompilerException where -- show (SomeCompilerException e) = show e -- -- instance Exception SomeCompilerException -- -- compilerExceptionToException :: Exception e => e -> SomeException -- compilerExceptionToException = toException . SomeCompilerException -- -- compilerExceptionFromException :: Exception e => SomeException -> Maybe e -- compilerExceptionFromException x = do -- SomeCompilerException a <- fromException x -- cast a -- -- --------------------------------------------------------------------- -- -- Make a subhierarchy for exceptions in the frontend of the compiler -- -- data SomeFrontendException = forall e . Exception e => SomeFrontendException e -- deriving Typeable -- -- instance Show SomeFrontendException where -- show (SomeFrontendException e) = show e -- -- instance Exception SomeFrontendException where -- toException = compilerExceptionToException -- fromException = compilerExceptionFromException -- -- frontendExceptionToException :: Exception e => e -> SomeException -- frontendExceptionToException = toException . SomeFrontendException -- -- frontendExceptionFromException :: Exception e => SomeException -> Maybe e -- frontendExceptionFromException x = do -- SomeFrontendException a <- fromException x -- cast a -- -- --------------------------------------------------------------------- -- -- Make an exception type for a particular frontend compiler exception -- -- data MismatchedParentheses = MismatchedParentheses -- deriving (Typeable, Show) -- -- instance Exception MismatchedParentheses where -- toException = frontendExceptionToException -- fromException = frontendExceptionFromException ---- -- We can now catch a MismatchedParentheses exception as -- MismatchedParentheses, SomeFrontendException or -- SomeCompilerException, but not other types, e.g. -- IOException: -- --
-- *Main> throw MismatchedParentheses catch e -> putStrLn ("Caught " ++ show (e :: MismatchedParentheses))
-- Caught MismatchedParentheses
-- *Main> throw MismatchedParentheses catch e -> putStrLn ("Caught " ++ show (e :: SomeFrontendException))
-- Caught MismatchedParentheses
-- *Main> throw MismatchedParentheses catch e -> putStrLn ("Caught " ++ show (e :: SomeCompilerException))
-- Caught MismatchedParentheses
-- *Main> throw MismatchedParentheses catch e -> putStrLn ("Caught " ++ show (e :: IOException))
-- *** Exception: MismatchedParentheses
--
class (Typeable e, Show e) => Exception e
toException :: Exception e => e -> SomeException
fromException :: Exception e => SomeException -> Maybe e
-- | The SomeException type is the root of the exception type
-- hierarchy. When an exception of type e is thrown, behind the
-- scenes it is encapsulated in a SomeException.
data SomeException :: *
SomeException :: e -> SomeException
instance Monad m => Functor (Handler m)
instance MonadRWS r w s m => MonadRWS r w s (CatchT m)
instance MonadWriter w m => MonadWriter w (CatchT m)
instance MonadReader e m => MonadReader e (CatchT m)
instance MonadState s m => MonadState s (CatchT m)
instance Monad m => MonadCatch (CatchT m)
instance MonadIO m => MonadIO (CatchT m)
instance MonadTrans CatchT
instance Monad m => MonadPlus (CatchT m)
instance Monad m => Alternative (CatchT m)
instance (Monad m, Traversable m) => Traversable (CatchT m)
instance Foldable m => Foldable (CatchT m)
instance MonadFix m => MonadFix (CatchT m)
instance Monad m => Monad (CatchT m)
instance Monad m => Applicative (CatchT m)
instance Monad m => Functor (CatchT m)
instance (MonadCatch m, Monoid w) => MonadCatch (RWST r w s m)
instance (MonadCatch m, Monoid w) => MonadCatch (RWST r w s m)
instance (MonadCatch m, Monoid w) => MonadCatch (WriterT w m)
instance (MonadCatch m, Monoid w) => MonadCatch (WriterT w m)
instance MonadCatch m => MonadCatch (ReaderT r m)
instance MonadCatch m => MonadCatch (StateT s m)
instance MonadCatch m => MonadCatch (StateT s m)
instance MonadCatch m => MonadCatch (IdentityT m)
instance MonadCatch IO