-- 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)