-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | An mtl-compatible monad transformer for unchecked extensible
exceptions.
--
-- This package provides a monad transformer that allows unchecked
-- extensible exceptions to be thrown and caught.
@package exception-mtl
@version 0.1
module Control.Monad.Exception
-- | Any type that you wish to throw or catch as an exception must be an
-- instance of the Exception class. The simplest case is a new
-- exception type directly below the root:
--
-- 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 :: *
class (Monad m) => MonadException m
throw :: (MonadException m, Exception e) => e -> m a
catch :: (MonadException m, Exception e) => m a -> (e -> m a) -> m a
class (MonadIO m, MonadException m) => MonadIOException m
block :: (MonadIOException m) => m a -> m a
unblock :: (MonadIOException m) => m a -> m a
newtype ExceptionT m a
ExceptionT :: m (Either SomeException a) -> ExceptionT m a
runExceptionT :: ExceptionT m a -> m (Either SomeException a)
mapExceptionT :: (m (Either SomeException a) -> n (Either SomeException b)) -> ExceptionT m a -> ExceptionT n b
liftException :: (MonadException m) => Either SomeException a -> m a
instance (Monoid w, MonadIOException m) => MonadIOException (WriterT w m)
instance (Monoid w, MonadIOException m) => MonadIOException (WriterT w m)
instance (MonadIOException m) => MonadIOException (StateT s m)
instance (MonadIOException m) => MonadIOException (StateT s m)
instance (MonadIOException m) => MonadIOException (ReaderT r m)
instance (Monoid w, MonadIOException m) => MonadIOException (RWST r w s m)
instance (Monoid w, MonadIOException m) => MonadIOException (RWST r w s m)
instance (MonadIOException m) => MonadIOException (ExceptionT m)
instance MonadIOException IO
instance (Monoid w, MonadException m) => MonadException (WriterT w m)
instance (Monoid w, MonadException m) => MonadException (WriterT w m)
instance (MonadException m) => MonadException (StateT s m)
instance (MonadException m) => MonadException (StateT s m)
instance (MonadException m) => MonadException (ReaderT r m)
instance (Monoid w, MonadException m) => MonadException (RWST r w s m)
instance (Monoid w, MonadException m) => MonadException (RWST r w s m)
instance MonadException IO
instance (MonadWriter w m) => MonadWriter w (ExceptionT m)
instance (MonadState s m) => MonadState s (ExceptionT m)
instance (MonadReader r m) => MonadReader r (ExceptionT m)
instance (MonadRWS r w s m) => MonadRWS r w s (ExceptionT m)
instance (MonadCont m) => MonadCont (ExceptionT m)
instance (MonadIO m) => MonadIO (ExceptionT m)
instance MonadTrans ExceptionT
instance (Monad m) => MonadException (ExceptionT m)
instance (MonadFix m) => MonadFix (ExceptionT m)
instance (Monad m) => MonadPlus (ExceptionT m)
instance (Monad m) => Monad (ExceptionT m)
instance (Monad m) => Functor (ExceptionT m)