control-monad-exception-0.6: Explicitly typed, checked exceptions with stack tracesSource codeContentsIndex
Control.Monad.Exception.Base
Description

A Monad Transformer for explicitly typed checked exceptions.

The exceptions thrown by a computation are inferred by the typechecker and appear in the type signature of the computation as Throws constraints.

Exceptions are defined using the extensible exceptions framework of Marlow (documented in Control.Exception):

  • An Extensible Dynamically-Typed Hierarchy of Exceptions, by Simon Marlow, in Haskell '06.

Example

 data DivideByZero = DivideByZero deriving (Show, Typeable)
 data SumOverflow  = SumOverflow  deriving (Show, Typeable)
 instance Exception DivideByZero
 instance Exception SumOverflow
 data Expr = Add Expr Expr | Div Expr Expr | Val Double
 eval (Val x)     = return x
 eval (Add a1 a2) = do
    v1 <- eval a1
    v2 <- eval a2
    let sum = v1 + v2
    if sum < v1 || sum < v2 then throw SumOverflow else return sum
 eval (Div a1 a2) = do
    v1 <- eval a1
    v2 <- eval a2
    if v2 == 0 then throw DivideByZero else return (v1 / v2)

GHCi infers the following types

 eval                                             :: (Throws DivideByZero l, Throws SumOverflow l) => Expr -> EM l Double
 eval `catch` \ (e::DivideByZero) -> return (-1)  :: Throws SumOverflow l => Expr -> EM l Double
 runEM(eval `catch` \ (e::SomeException) -> return (-1))
                                                  :: Expr -> Double
Synopsis
type CallTrace = [String]
newtype EMT l m a = EMT {
unEMT :: m (Either (CallTrace, CheckedException l) a)
}
type AnyException = Caught SomeException
tryEMT :: Monad m => EMT (AnyException l) m a -> m (Either SomeException a)
runEMT_gen :: forall l m a. Monad m => EMT l m a -> m a
data NoExceptions
data ParanoidMode
runEMT :: Monad m => EMT NoExceptions m a -> m a
runEMTParanoid :: Monad m => EMT ParanoidMode m a -> m a
throw :: (Exception e, Throws e l, Monad m) => e -> EMT l m a
rethrow :: (Throws e l, Monad m) => CallTrace -> e -> EMT l m a
catch :: (Exception e, Monad m) => EMT (Caught e l) m a -> (e -> EMT l m a) -> EMT l m a
catchWithSrcLoc :: (Exception e, Monad m) => EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
finally :: Monad m => EMT l m a -> EMT l m b -> EMT l m a
onException :: Monad m => EMT l m a -> EMT l m b -> EMT l m a
bracket :: Monad m => EMT l m a -> (a -> EMT l m b) -> (a -> EMT l m c) -> EMT l m c
wrapException :: (Exception e, Throws e' l, Monad m) => (e -> e') -> EMT (Caught e l) m a -> EMT l m a
showExceptionWithTrace :: Exception e => [String] -> e -> String
class Exception e => UncaughtException e
type EM l = EMT l Identity
tryEM :: EM (AnyException l) a -> Either SomeException a
runEM :: EM NoExceptions a -> a
runEMParanoid :: EM ParanoidMode a -> a
newtype Identity a = Identity {
runIdentity :: a
}
data NothingException = NothingException
class Try m l where
try :: Monad m' => m a -> EMT l m' a
data FailException = FailException String
data MonadZeroException = MonadZeroException
mapLeft :: (a -> b) -> Either a r -> Either b r
Documentation
type CallTrace = [String]Source
newtype EMT l m a Source
A Monad Transformer for explicitly typed checked exceptions.
Constructors
EMT
unEMT :: m (Either (CallTrace, CheckedException l) a)
show/hide Instances
(Monoid w, MonadRWS r w s m) => MonadRWS r w s (EMT l m)
(Monoid w, MonadRWS r w s m) => MonadRWS r w s (EMT l m)
(Exception e, Throws e l, Monad m) => MonadFailure e (EMT l m)
(Exception e, Throws e l, Monad m) => WrapFailure e (EMT l m)
MonadReader r m => MonadReader r (EMT l m)
MonadState s m => MonadState s (EMT l m)
(Monoid w, MonadWriter w m) => MonadWriter w (EMT l m)
MonadReader r m => MonadReader r (EMT l m)
MonadState s m => MonadState s (EMT l m)
(Monoid w, MonadWriter w m) => MonadWriter w (EMT l m)
(Exception e, Monad m) => MonadCatch e (EMT (Caught e l) m) (EMT l m)
Throws MonadZeroException l => MonadPlus (EM l)
Throws MonadZeroException l => MonadPlus (EM l)
MonadTrans (EMT l)
MonadTrans (EMT l)
Monad m => Monad (EMT l m)
Monad m => Functor (EMT l m)
MonadFix m => MonadFix (EMT l m)
Monad m => Applicative (EMT l m)
Monad m => MonadLoc (EMT l m)
(Throws SomeException l, MonadIO m) => MonadIO (EMT l m)
MonadCont m => MonadCont (EMT l m)
MonadCont m => MonadCont (EMT l m)
(Throws SomeException l, MonadIO m) => MonadIO (EMT l m)
(Monad m, Try m l) => Try (EMT l m) l
type AnyException = Caught SomeExceptionSource
tryEMT :: Monad m => EMT (AnyException l) m a -> m (Either SomeException a)Source
Run a computation explicitly handling exceptions
runEMT_gen :: forall l m a. Monad m => EMT l m a -> m aSource
data NoExceptions Source
show/hide Instances
data ParanoidMode Source
runEMT :: Monad m => EMT NoExceptions m a -> m aSource
Run a safe computation
runEMTParanoid :: Monad m => EMT ParanoidMode m a -> m aSource
Run a safe computation checking even unchecked (UncaughtException) exceptions
throw :: (Exception e, Throws e l, Monad m) => e -> EMT l m aSource
The throw primitive
rethrow :: (Throws e l, Monad m) => CallTrace -> e -> EMT l m aSource
Rethrow an exception keeping the call trace
catch :: (Exception e, Monad m) => EMT (Caught e l) m a -> (e -> EMT l m a) -> EMT l m aSource
The catch primitive
catchWithSrcLoc :: (Exception e, Monad m) => EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m aSource
Like catch but makes the call trace available
finally :: Monad m => EMT l m a -> EMT l m b -> EMT l m aSource
Sequence two computations discarding the result of the second one. If the first computation rises an exception, the second computation is run and then the exception is rethrown.
onException :: Monad m => EMT l m a -> EMT l m b -> EMT l m aSource
Like finally, but performs the second computation only when the first one rises an exception
bracketSource
:: Monad m
=> EMT l m aacquire resource
-> a -> EMT l m brelease resource
-> a -> EMT l m ccomputation
-> EMT l m c
wrapException :: (Exception e, Throws e' l, Monad m) => (e -> e') -> EMT (Caught e l) m a -> EMT l m aSource
Capture an exception e, wrap it, and rethrow. Keeps the original monadic call trace.
showExceptionWithTrace :: Exception e => [String] -> e -> StringSource
class Exception e => UncaughtException e Source

Uncaught Exceptions model unchecked exceptions

In order to declare an unchecked exception E, all that is needed is to make e an instance of UncaughtException

 instance UncaughtException E

Note that declaring an exception E as unchecked does not automatically turn its children as unchecked too. This is a shortcoming of the current encoding.

If that is what you want, then declare E as unchecked and unexplicit using an instance of Throws:

 instance Throws E l
show/hide Instances
type EM l = EMT l IdentitySource
A monad of explicitly typed, checked exceptions
tryEM :: EM (AnyException l) a -> Either SomeException aSource
Run a computation explicitly handling exceptions
runEM :: EM NoExceptions a -> aSource
Run a safe computation
runEMParanoid :: EM ParanoidMode a -> aSource
Run a computation checking even unchecked (UncaughtExceptions) exceptions
newtype Identity a Source
Constructors
Identity
runIdentity :: a
show/hide Instances
data NothingException Source
Constructors
NothingException
show/hide Instances
class Try m l whereSource
Methods
try :: Monad m' => m a -> EMT l m' aSource
The purpose of try is to combine EMT with other failure handling data types. try accepts a failing computation and turns it into an EMT computation. The instances provided allow you to try on Maybe and Either computations.
show/hide Instances
Throws NothingException l => Try Maybe l
(Exception e, Throws e l) => Try (Either e) l
(Monad m, Try m l) => Try (EMT l m) l
data FailException Source
FailException is thrown by Monad fail
Constructors
FailException String
show/hide Instances
data MonadZeroException Source
MonadZeroException is thrown by MonadPlus mzero
Constructors
MonadZeroException
show/hide Instances
mapLeft :: (a -> b) -> Either a r -> Either b rSource
Produced by Haddock version 2.4.2