-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Type classes and monads for unchecked extensible exceptions. -- -- This package provides type classes, a monad and a monad transformer -- that support unchecked extensible exceptions as well as asynchronous -- exceptions. It is compatible with the transformers package. @package exception-transformers @version 0.3 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 finally :: MonadException m => m a -> m b -> m a -- | If an exception is raised by the computation, then perform a final -- action and re-raise the exception. If a short-circuiting monad -- transformer such as ErrorT or MaybeT is used to transform a -- MonadException monad, then the onException implementation for the -- transformer must guarantee that the final action is also performed -- when any short-circuiting occurs. onException :: MonadException m => m a -> m b -> m a class (MonadIO m, MonadException m) => MonadAsyncException m mask :: MonadAsyncException m => ((forall a. m a -> m a) -> m b) -> m b -- | When you want to acquire a resource, do some work with it, and then -- release the resource, it is a good idea to use bracket, because -- bracket will install the necessary exception handler to release -- the resource in the event that an exception is raised during the -- computation. If an exception is raised, then bracket will -- re-raise the exception (after performing the release). bracket :: MonadAsyncException m => m a -> (a -> m b) -> (a -> m c) -> m c -- | A variant of bracket where the return value from the first -- computation is not required. bracket_ :: MonadAsyncException m => m a -> m b -> m c -> m c 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 -- | Lift the result of running a computation in a monad transformed by -- ExceptionT into another monad that supports exceptions. liftException :: MonadException m => Either SomeException a -> m a instance (Monoid w, MonadAsyncException m) => MonadAsyncException (WriterT w m) instance (Monoid w, MonadAsyncException m) => MonadAsyncException (WriterT w m) instance MonadAsyncException m => MonadAsyncException (StateT s m) instance MonadAsyncException m => MonadAsyncException (StateT s m) instance MonadAsyncException m => MonadAsyncException (ReaderT r m) instance (Monoid w, MonadAsyncException m) => MonadAsyncException (RWST r w s m) instance (Monoid w, MonadAsyncException m) => MonadAsyncException (RWST r w s m) instance MonadAsyncException m => MonadAsyncException (MaybeT m) instance MonadAsyncException m => MonadAsyncException (ListT m) instance MonadAsyncException m => MonadAsyncException (IdentityT m) instance (MonadAsyncException m, Error e) => MonadAsyncException (ErrorT e m) 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 m => MonadException (MaybeT m) instance MonadException m => MonadException (ListT m) instance MonadException m => MonadException (IdentityT m) instance (MonadException m, Error e) => MonadException (ErrorT e m) instance MonadException STM instance MonadAsyncException IO instance MonadException IO instance MonadAsyncException m => MonadAsyncException (ExceptionT m) instance MonadIO m => MonadIO (ExceptionT m) instance Monad m => MonadException (ExceptionT m) instance MonadFix m => MonadFix (ExceptionT m) instance (Functor m, Monad m) => Alternative (ExceptionT m) instance (Functor m, Monad m) => Applicative (ExceptionT m) instance Monad m => MonadPlus (ExceptionT m) instance Monad m => Monad (ExceptionT m) instance Functor m => Functor (ExceptionT m) instance MonadTrans ExceptionT