Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Please see the README.md file in the safe-exceptions repo for information on how to use this module. Relevant links:
Synopsis
- throw :: ( MonadThrow m, Exception e) => e -> m a
- throwIO :: ( MonadThrow m, Exception e) => e -> m a
- throwM :: ( MonadThrow m, Exception e) => e -> m a
- throwString :: ( MonadThrow m, HasCallStack ) => String -> m a
- data StringException = StringException String CallStack
- throwTo :: ( Exception e, MonadIO m) => ThreadId -> e -> m ()
- impureThrow :: Exception e => e -> a
- catch :: ( MonadCatch m, Exception e) => m a -> (e -> m a) -> m a
- catchIO :: MonadCatch m => m a -> ( IOException -> m a) -> m a
- catchAny :: MonadCatch m => m a -> ( SomeException -> m a) -> m a
- catchDeep :: ( MonadCatch m, MonadIO m, Exception e, NFData a) => m a -> (e -> m a) -> m a
- catchAnyDeep :: ( MonadCatch m, MonadIO m, NFData a) => m a -> ( SomeException -> m a) -> m a
- catchAsync :: ( MonadCatch m, Exception e) => m a -> (e -> m a) -> m a
- catchJust :: ( MonadCatch m, Exception e) => (e -> Maybe b) -> m a -> (b -> m a) -> m a
- handle :: ( MonadCatch m, Exception e) => (e -> m a) -> m a -> m a
- handleIO :: MonadCatch m => ( IOException -> m a) -> m a -> m a
- handleAny :: MonadCatch m => ( SomeException -> m a) -> m a -> m a
- handleDeep :: ( MonadCatch m, Exception e, MonadIO m, NFData a) => (e -> m a) -> m a -> m a
- handleAnyDeep :: ( MonadCatch m, MonadIO m, NFData a) => ( SomeException -> m a) -> m a -> m a
- handleAsync :: ( MonadCatch m, Exception e) => (e -> m a) -> m a -> m a
- handleJust :: ( MonadCatch m, Exception e) => (e -> Maybe b) -> (b -> m a) -> m a -> m a
- try :: ( MonadCatch m, Exception e) => m a -> m ( Either e a)
- tryIO :: MonadCatch m => m a -> m ( Either IOException a)
- tryAny :: MonadCatch m => m a -> m ( Either SomeException a)
- tryDeep :: ( MonadCatch m, MonadIO m, Exception e, NFData a) => m a -> m ( Either e a)
- tryAnyDeep :: ( MonadCatch m, MonadIO m, NFData a) => m a -> m ( Either SomeException a)
- tryAsync :: ( MonadCatch m, Exception e) => m a -> m ( Either e a)
- tryJust :: ( MonadCatch m, Exception e) => (e -> Maybe b) -> m a -> m ( Either b a)
- data Handler (m :: Type -> Type ) a = Exception e => Handler (e -> m a)
- catches :: ( MonadCatch m, MonadThrow m) => m a -> [ Handler m a] -> m a
- catchesDeep :: ( MonadCatch m, MonadThrow m, MonadIO m, NFData a) => m a -> [ Handler m a] -> m a
- catchesAsync :: ( MonadCatch m, MonadThrow m) => m a -> [ Handler m a] -> m a
- onException :: MonadMask m => m a -> m b -> m a
- bracket :: forall m a b c. MonadMask m => m a -> (a -> m b) -> (a -> m c) -> m c
- bracket_ :: MonadMask m => m a -> m b -> m c -> m c
- finally :: MonadMask m => m a -> m b -> m a
- withException :: ( MonadMask m, Exception e) => m a -> (e -> m b) -> m a
- bracketOnError :: forall m a b c. MonadMask m => m a -> (a -> m b) -> (a -> m c) -> m c
- bracketOnError_ :: MonadMask m => m a -> m b -> m c -> m c
- bracketWithError :: forall m a b c. MonadMask m => m a -> ( Maybe SomeException -> a -> m b) -> (a -> m c) -> m c
- data SyncExceptionWrapper = forall e. Exception e => SyncExceptionWrapper e
- toSyncException :: Exception e => e -> SomeException
- data AsyncExceptionWrapper = forall e. Exception e => AsyncExceptionWrapper e
- toAsyncException :: Exception e => e -> SomeException
- isSyncException :: Exception e => e -> Bool
- isAsyncException :: Exception e => e -> Bool
- class Monad m => MonadThrow (m :: Type -> Type )
- class MonadThrow m => MonadCatch (m :: Type -> Type )
-
class
MonadCatch
m =>
MonadMask
(m ::
Type
->
Type
)
where
- mask :: (( forall a. m a -> m a) -> m b) -> m b
- uninterruptibleMask :: (( forall a. m a -> m a) -> m b) -> m b
- generalBracket :: m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c)
- mask_ :: MonadMask m => m a -> m a
- uninterruptibleMask_ :: MonadMask m => m a -> m a
- catchIOError :: MonadCatch m => m a -> ( IOError -> m a) -> m a
- handleIOError :: MonadCatch m => ( IOError -> m a) -> m a -> m a
-
class
(
Typeable
e,
Show
e) =>
Exception
e
where
- toException :: e -> SomeException
- fromException :: SomeException -> Maybe e
- displayException :: e -> String
- class Typeable (a :: k)
- data SomeException = Exception e => SomeException e
- data SomeAsyncException = Exception e => SomeAsyncException e
- data IOException
- assert :: Bool -> a -> a
Throwing
throw :: ( MonadThrow m, Exception e) => e -> m a Source #
Synchronously throw the given exception
Since: 0.1.0.0
throwString :: ( MonadThrow m, HasCallStack ) => String -> m a Source #
A convenience function for throwing a user error. This is useful for cases where it would be too high a burden to define your own exception type.
This throws an exception of type
StringException
. When GHC
supports it (base 4.9 and GHC 8.0 and onward), it includes a call
stack.
Since: 0.1.5.0
data StringException Source #
Exception type thrown by
throwString
.
Note that the second field of the data constructor depends on GHC/base version. For base 4.9 and GHC 8.0 and later, the second field is a call stack. Previous versions of GHC and base do not support call stacks, and the field is simply unit (provided to make pattern matching across GHC versions easier).
Since: 0.1.5.0
Instances
Show StringException Source # | |
Defined in Control.Exception.Safe |
|
Exception StringException Source # | |
Defined in Control.Exception.Safe |
throwTo :: ( Exception e, MonadIO m) => ThreadId -> e -> m () Source #
Throw an asynchronous exception to another thread.
Synchronously typed exceptions will be wrapped into an
AsyncExceptionWrapper
, see
https://github.com/fpco/safe-exceptions#determining-sync-vs-async
It's usually a better idea to use the async package, see https://github.com/fpco/safe-exceptions#quickstart
Since: 0.1.0.0
impureThrow :: Exception e => e -> a Source #
Generate a pure value which, when forced, will synchronously throw the given exception
Generally it's better to avoid using this function and instead use
throw
,
see
https://github.com/fpco/safe-exceptions#quickstart
Since: 0.1.0.0
Catching (with recovery)
catch :: ( MonadCatch m, Exception e) => m a -> (e -> m a) -> m a Source #
Same as upstream
catch
, but will not catch asynchronous
exceptions
Since: 0.1.0.0
catchIO :: MonadCatch m => m a -> ( IOException -> m a) -> m a Source #
catch
specialized to only catching
IOException
s
Since: 0.1.3.0
catchAny :: MonadCatch m => m a -> ( SomeException -> m a) -> m a Source #
catch
specialized to catch all synchronous exception
Since: 0.1.0.0
catchDeep :: ( MonadCatch m, MonadIO m, Exception e, NFData a) => m a -> (e -> m a) -> m a Source #
Same as
catch
, but fully force evaluation of the result value
to find all impure exceptions.
Since: 0.1.1.0
catchAnyDeep :: ( MonadCatch m, MonadIO m, NFData a) => m a -> ( SomeException -> m a) -> m a Source #
catchDeep
specialized to catch all synchronous exception
Since: 0.1.1.0
catchAsync :: ( MonadCatch m, Exception e) => m a -> (e -> m a) -> m a Source #
catch
without async exception safety
Generally it's better to avoid using this function since we do not want to recover from async exceptions, see https://github.com/fpco/safe-exceptions#quickstart
Since: 0.1.0.0
handle :: ( MonadCatch m, Exception e) => (e -> m a) -> m a -> m a Source #
Flipped version of
catch
Since: 0.1.0.0
handleIO :: MonadCatch m => ( IOException -> m a) -> m a -> m a Source #
handle
specialized to only catching
IOException
s
Since: 0.1.3.0
handleAny :: MonadCatch m => ( SomeException -> m a) -> m a -> m a Source #
Flipped version of
catchAny
Since: 0.1.0.0
handleDeep :: ( MonadCatch m, Exception e, MonadIO m, NFData a) => (e -> m a) -> m a -> m a Source #
Flipped version of
catchDeep
Since: 0.1.1.0
handleAnyDeep :: ( MonadCatch m, MonadIO m, NFData a) => ( SomeException -> m a) -> m a -> m a Source #
Flipped version of
catchAnyDeep
Since: 0.1.1.0
handleAsync :: ( MonadCatch m, Exception e) => (e -> m a) -> m a -> m a Source #
Flipped version of
catchAsync
Generally it's better to avoid using this function since we do not want to recover from async exceptions, see https://github.com/fpco/safe-exceptions#quickstart
Since: 0.1.0.0
handleJust :: ( MonadCatch m, Exception e) => (e -> Maybe b) -> (b -> m a) -> m a -> m a Source #
Flipped
catchJust
.
Since: 0.1.4.0
try :: ( MonadCatch m, Exception e) => m a -> m ( Either e a) Source #
Same as upstream
try
, but will not catch asynchronous
exceptions
Since: 0.1.0.0
tryIO :: MonadCatch m => m a -> m ( Either IOException a) Source #
try
specialized to only catching
IOException
s
Since: 0.1.3.0
tryAny :: MonadCatch m => m a -> m ( Either SomeException a) Source #
try
specialized to catch all synchronous exceptions
Since: 0.1.0.0
tryDeep :: ( MonadCatch m, MonadIO m, Exception e, NFData a) => m a -> m ( Either e a) Source #
Same as
try
, but fully force evaluation of the result value
to find all impure exceptions.
Since: 0.1.1.0
tryAnyDeep :: ( MonadCatch m, MonadIO m, NFData a) => m a -> m ( Either SomeException a) Source #
tryDeep
specialized to catch all synchronous exceptions
Since: 0.1.1.0
tryAsync :: ( MonadCatch m, Exception e) => m a -> m ( Either e a) Source #
try
without async exception safety
Generally it's better to avoid using this function since we do not want to recover from async exceptions, see https://github.com/fpco/safe-exceptions#quickstart
Since: 0.1.0.0
tryJust :: ( MonadCatch m, Exception e) => (e -> Maybe b) -> m a -> m ( Either b a) Source #
A variant of
try
that takes an exception predicate to select
which exceptions are caught.
Since: 0.1.4.0
catches :: ( MonadCatch m, MonadThrow m) => m a -> [ Handler m a] -> m a Source #
Same as upstream
catches
, but will not catch asynchronous
exceptions
Since: 0.1.2.0
catchesDeep :: ( MonadCatch m, MonadThrow m, MonadIO m, NFData a) => m a -> [ Handler m a] -> m a Source #
Same as
catches
, but fully force evaluation of the result value
to find all impure exceptions.
Since: 0.1.2.0
catchesAsync :: ( MonadCatch m, MonadThrow m) => m a -> [ Handler m a] -> m a Source #
catches
without async exception safety
Generally it's better to avoid using this function since we do not want to recover from async exceptions, see https://github.com/fpco/safe-exceptions#quickstart
Since: 0.1.2.0
Cleanup (no recovery)
onException :: MonadMask m => m a -> m b -> m a Source #
Async safe version of
onException
Since: 0.1.0.0
bracket :: forall m a b c. MonadMask m => m a -> (a -> m b) -> (a -> m c) -> m c Source #
Async safe version of
bracket
Since: 0.1.0.0
bracket_ :: MonadMask m => m a -> m b -> m c -> m c Source #
Async safe version of
bracket_
Since: 0.1.0.0
withException :: ( MonadMask m, Exception e) => m a -> (e -> m b) -> m a Source #
Like
onException
, but provides the handler the thrown
exception.
Since: 0.1.0.0
bracketOnError :: forall m a b c. MonadMask m => m a -> (a -> m b) -> (a -> m c) -> m c Source #
Async safe version of
bracketOnError
Since: 0.1.0.0
bracketOnError_ :: MonadMask m => m a -> m b -> m c -> m c Source #
A variant of
bracketOnError
where the return value from the first
computation is not required.
Since: 0.1.0.0
bracketWithError :: forall m a b c. MonadMask m => m a -> ( Maybe SomeException -> a -> m b) -> (a -> m c) -> m c Source #
Async safe version of
bracket
with access to the exception in the
cleanup action.
Since: 0.1.7.0
Coercion to sync and async
data SyncExceptionWrapper Source #
Wrap up an asynchronous exception to be treated as a synchronous exception
This is intended to be created via
toSyncException
Since: 0.1.0.0
forall e. Exception e => SyncExceptionWrapper e |
Instances
Show SyncExceptionWrapper Source # | |
Defined in Control.Exception.Safe |
|
Exception SyncExceptionWrapper Source # | |
Defined in Control.Exception.Safe |
toSyncException :: Exception e => e -> SomeException Source #
Convert an exception into a synchronous exception
For synchronous exceptions, this is the same as
toException
.
For asynchronous exceptions, this will wrap up the exception with
SyncExceptionWrapper
Since: 0.1.0.0
data AsyncExceptionWrapper Source #
Wrap up a synchronous exception to be treated as an asynchronous exception
This is intended to be created via
toAsyncException
Since: 0.1.0.0
forall e. Exception e => AsyncExceptionWrapper e |
Instances
toAsyncException :: Exception e => e -> SomeException Source #
Convert an exception into an asynchronous exception
For asynchronous exceptions, this is the same as
toException
.
For synchronous exceptions, this will wrap up the exception with
AsyncExceptionWrapper
Since: 0.1.0.0
Check exception type
isSyncException :: Exception e => e -> Bool Source #
Check if the given exception is synchronous
Since: 0.1.0.0
isAsyncException :: Exception e => e -> Bool Source #
Check if the given exception is asynchronous
Since: 0.1.0.0
Reexports
class Monad m => MonadThrow (m :: Type -> Type ) Source #
A class for monads in which exceptions may be thrown.
Instances should obey the following law:
throwM e >> x = throwM e
In other words, throwing an exception short-circuits the rest of the monadic computation.
Instances
MonadThrow [] | |
Defined in Control.Monad.Catch |
|
MonadThrow Maybe | |
MonadThrow IO | |
MonadThrow Q | |
MonadThrow STM | |
e ~ SomeException => MonadThrow ( Either e) | |
MonadThrow ( ST s) | |
MonadThrow m => MonadThrow ( MaybeT m) |
Throws exceptions into the base monad. |
MonadThrow m => MonadThrow ( ListT m) | |
MonadThrow m => MonadThrow ( ExceptT e m) |
Throws exceptions into the base monad. |
MonadThrow m => MonadThrow ( IdentityT m) | |
( Error e, MonadThrow m) => MonadThrow ( ErrorT e m) |
Throws exceptions into the base monad. |
MonadThrow m => MonadThrow ( ReaderT r m) | |
MonadThrow m => MonadThrow ( StateT s m) | |
MonadThrow m => MonadThrow ( StateT s m) | |
( MonadThrow m, Monoid w) => MonadThrow ( WriterT w m) | |
( MonadThrow m, Monoid w) => MonadThrow ( WriterT w m) | |
MonadThrow m => MonadThrow ( ContT r m) | |
( MonadThrow m, Monoid w) => MonadThrow ( RWST r w s m) | |
( MonadThrow m, Monoid w) => MonadThrow ( RWST r w s m) | |
class MonadThrow m => MonadCatch (m :: Type -> Type ) Source #
A class for monads which allow exceptions to be caught, in particular
exceptions which were thrown by
throwM
.
Instances should obey the following law:
catch (throwM e) f = f e
Note that the ability to catch an exception does
not
guarantee that we can
deal with all possible exit points from a computation. Some monads, such as
continuation-based stacks, allow for more than just a success/failure
strategy, and therefore
catch
cannot
be used by those monads to properly
implement a function such as
finally
. For more information, see
MonadMask
.
Instances
MonadCatch IO | |
MonadCatch STM | |
e ~ SomeException => MonadCatch ( Either e) |
Since: exceptions-0.8.3 |
MonadCatch m => MonadCatch ( MaybeT m) |
Catches exceptions from the base monad. |
MonadCatch m => MonadCatch ( ListT m) | |
MonadCatch m => MonadCatch ( ExceptT e m) |
Catches exceptions from the base monad. |
MonadCatch m => MonadCatch ( IdentityT m) | |
( Error e, MonadCatch m) => MonadCatch ( ErrorT e m) |
Catches exceptions from the base monad. |
MonadCatch m => MonadCatch ( ReaderT r m) | |
MonadCatch m => MonadCatch ( StateT s m) | |
MonadCatch m => MonadCatch ( StateT s m) | |
( MonadCatch m, Monoid w) => MonadCatch ( WriterT w m) | |
( MonadCatch m, Monoid w) => MonadCatch ( WriterT w m) | |
( MonadCatch m, Monoid w) => MonadCatch ( RWST r w s m) | |
( MonadCatch m, Monoid w) => MonadCatch ( RWST r w s m) | |
class MonadCatch m => MonadMask (m :: Type -> Type ) where Source #
A class for monads which provide for the ability to account for all possible exit points from a computation, and to mask asynchronous exceptions. Continuation-based monads are invalid instances of this class.
Instances should ensure that, in the following code:
fg = f `finally` g
The action
g
is called regardless of what occurs within
f
, including
async exceptions. Some monads allow
f
to abort the computation via other
effects than throwing an exception. For simplicity, we will consider aborting
and throwing an exception to be two forms of "throwing an error".
If
f
and
g
both throw an error, the error thrown by
fg
depends on which
errors we're talking about. In a monad transformer stack, the deeper layers
override the effects of the inner layers; for example,
ExceptT e1 (Except
e2) a
represents a value of type
Either e2 (Either e1 a)
, so throwing both
an
e1
and an
e2
will result in
Left e2
. If
f
and
g
both throw an
error from the same layer, instances should ensure that the error from
g
wins.
Effects other than throwing an error are also overriden by the deeper layers.
For example,
StateT s Maybe a
represents a value of type
s -> Maybe (a,
s)
, so if an error thrown from
f
causes this function to return
Nothing
,
any changes to the state which
f
also performed will be erased. As a
result,
g
will see the state as it was before
f
. Once
g
completes,
f
's error will be rethrown, so
g
' state changes will be erased as well.
This is the normal interaction between effects in a monad transformer stack.
By contrast,
lifted-base
's
version of
finally
always discards all of
g
's non-IO effects, and
g
never sees any of
f
's non-IO effects, regardless of the layer ordering and
regardless of whether
f
throws an error. This is not the result of
interacting effects, but a consequence of
MonadBaseControl
's approach.
mask :: (( forall a. m a -> m a) -> m b) -> m b Source #
Runs an action with asynchronous exceptions disabled. The action is
provided a method for restoring the async. environment to what it was
at the
mask
call. See
Control.Exception
's
mask
.
uninterruptibleMask :: (( forall a. m a -> m a) -> m b) -> m b Source #
Like
mask
, but the masked computation is not interruptible (see
Control.Exception
's
uninterruptibleMask
. WARNING:
Only use if you need to mask exceptions around an interruptible operation
AND you can guarantee the interruptible operation will only block for a
short period of time. Otherwise you render the program/thread unresponsive
and/or unkillable.
:: m a |
acquire some resource |
-> (a -> ExitCase b -> m c) |
release the resource, observing the outcome of the inner action |
-> (a -> m b) |
inner action to perform with the resource |
-> m (b, c) |
A generalized version of
bracket
which uses
ExitCase
to distinguish
the different exit cases, and returns the values of both the
use
and
release
actions. In practice, this extra information is rarely needed,
so it is often more convenient to use one of the simpler functions which
are defined in terms of this one, such as
bracket
,
finally
,
onError
,
and
bracketOnError
.
This function exists because in order to thread their effects through the
execution of
bracket
, monad transformers need values to be threaded from
use
to
release
and from
release
to the output value.
NOTE
This method was added in version 0.9.0 of this
library. Previously, implementation of functions like
bracket
and
finally
in this module were based on the
mask
and
uninterruptibleMask
functions only, disallowing some classes of
tranformers from having
MonadMask
instances (notably
multi-exit-point transformers like
ExceptT
). If you are a
library author, you'll now need to provide an implementation for
this method. The
StateT
implementation demonstrates most of the
subtleties:
generalBracket acquire release use = StateT $ s0 -> do ((b, _s2), (c, s3)) <- generalBracket (runStateT acquire s0) ((resource, s1) exitCase -> case exitCase of ExitCaseSuccess (b, s2) -> runStateT (release resource (ExitCaseSuccess b)) s2 -- In the two other cases, the base monad overridesuse
's state -- changes and the state reverts tos1
. ExitCaseException e -> runStateT (release resource (ExitCaseException e)) s1 ExitCaseAbort -> runStateT (release resource ExitCaseAbort) s1 ) ((resource, s1) -> runStateT (use resource) s1) return ((b, c), s3)
The
StateT s m
implementation of
generalBracket
delegates to the
m
implementation of
generalBracket
. The
acquire
,
use
, and
release
arguments given to
StateT
's implementation produce actions of type
StateT s m a
,
StateT s m b
, and
StateT s m c
. In order to run those
actions in the base monad, we need to call
runStateT
, from which we
obtain actions of type
m (a, s)
,
m (b, s)
, and
m (c, s)
. Since each
action produces the next state, it is important to feed the state produced
by the previous action to the next action.
In the
ExitCaseSuccess
case, the state starts at
s0
, flows through
acquire
to become
s1
, flows through
use
to become
s2
, and finally
flows through
release
to become
s3
. In the other two cases,
release
does not receive the value
s2
, so its action cannot see the state changes
performed by
use
. This is fine, because in those two cases, an error was
thrown in the base monad, so as per the usual interaction between effects
in a monad transformer stack, those state changes get reverted. So we start
from
s1
instead.
Finally, the
m
implementation of
generalBracket
returns the pairs
(b, s)
and
(c, s)
. For monad transformers other than
StateT
, this
will be some other type representing the effects and values performed and
returned by the
use
and
release
actions. The effect part of the
use
result, in this case
_s2
, usually needs to be discarded, since those
effects have already been incorporated in the
release
action.
The only effect which is intentionally not incorporated in the
release
action is the effect of throwing an error. In that case, the error must be
re-thrown. One subtlety which is easy to miss is that in the case in which
use
and
release
both throw an error, the error from
release
should
take priority. Here is an implementation for
ExceptT
which demonstrates
how to do this.
generalBracket acquire release use = ExceptT $ do (eb, ec) <- generalBracket (runExceptT acquire) (eresource exitCase -> case eresource of Left e -> return (Left e) -- nothing to release, acquire didn't succeed Right resource -> case exitCase of ExitCaseSuccess (Right b) -> runExceptT (release resource (ExitCaseSuccess b)) ExitCaseException e -> runExceptT (release resource (ExitCaseException e)) _ -> runExceptT (release resource ExitCaseAbort)) (either (return . Left) (runExceptT . use)) return $ do -- The order in which we perform those twoEither
effects determines -- which error will win if they are bothLeft
s. We want the error from --release
to win. c <- ec b <- eb return (b, c)
Since: exceptions-0.9.0
Instances
MonadMask IO | |
e ~ SomeException => MonadMask ( Either e) |
Since: exceptions-0.8.3 |
Defined in Control.Monad.Catch |
|
MonadMask m => MonadMask ( MaybeT m) |
Since: exceptions-0.10.0 |
Defined in Control.Monad.Catch |
|
MonadMask m => MonadMask ( ExceptT e m) |
Since: exceptions-0.9.0 |
Defined in Control.Monad.Catch mask :: (( forall a. ExceptT e m a -> ExceptT e m a) -> ExceptT e m b) -> ExceptT e m b Source # uninterruptibleMask :: (( forall a. ExceptT e m a -> ExceptT e m a) -> ExceptT e m b) -> ExceptT e m b Source # generalBracket :: ExceptT e m a -> (a -> ExitCase b -> ExceptT e m c) -> (a -> ExceptT e m b) -> ExceptT e m (b, c) Source # |
|
MonadMask m => MonadMask ( IdentityT m) | |
Defined in Control.Monad.Catch mask :: (( forall a. IdentityT m a -> IdentityT m a) -> IdentityT m b) -> IdentityT m b Source # uninterruptibleMask :: (( forall a. IdentityT m a -> IdentityT m a) -> IdentityT m b) -> IdentityT m b Source # generalBracket :: IdentityT m a -> (a -> ExitCase b -> IdentityT m c) -> (a -> IdentityT m b) -> IdentityT m (b, c) Source # |
|
( Error e, MonadMask m) => MonadMask ( ErrorT e m) | |
Defined in Control.Monad.Catch mask :: (( forall a. ErrorT e m a -> ErrorT e m a) -> ErrorT e m b) -> ErrorT e m b Source # uninterruptibleMask :: (( forall a. ErrorT e m a -> ErrorT e m a) -> ErrorT e m b) -> ErrorT e m b Source # generalBracket :: ErrorT e m a -> (a -> ExitCase b -> ErrorT e m c) -> (a -> ErrorT e m b) -> ErrorT e m (b, c) Source # |
|
MonadMask m => MonadMask ( ReaderT r m) | |
Defined in Control.Monad.Catch mask :: (( forall a. ReaderT r m a -> ReaderT r m a) -> ReaderT r m b) -> ReaderT r m b Source # uninterruptibleMask :: (( forall a. ReaderT r m a -> ReaderT r m a) -> ReaderT r m b) -> ReaderT r m b Source # generalBracket :: ReaderT r m a -> (a -> ExitCase b -> ReaderT r m c) -> (a -> ReaderT r m b) -> ReaderT r m (b, c) Source # |
|
MonadMask m => MonadMask ( StateT s m) | |
Defined in Control.Monad.Catch mask :: (( forall a. StateT s m a -> StateT s m a) -> StateT s m b) -> StateT s m b Source # uninterruptibleMask :: (( forall a. StateT s m a -> StateT s m a) -> StateT s m b) -> StateT s m b Source # generalBracket :: StateT s m a -> (a -> ExitCase b -> StateT s m c) -> (a -> StateT s m b) -> StateT s m (b, c) Source # |
|
MonadMask m => MonadMask ( StateT s m) | |
Defined in Control.Monad.Catch mask :: (( forall a. StateT s m a -> StateT s m a) -> StateT s m b) -> StateT s m b Source # uninterruptibleMask :: (( forall a. StateT s m a -> StateT s m a) -> StateT s m b) -> StateT s m b Source # generalBracket :: StateT s m a -> (a -> ExitCase b -> StateT s m c) -> (a -> StateT s m b) -> StateT s m (b, c) Source # |
|
( MonadMask m, Monoid w) => MonadMask ( WriterT w m) | |
Defined in Control.Monad.Catch mask :: (( forall a. WriterT w m a -> WriterT w m a) -> WriterT w m b) -> WriterT w m b Source # uninterruptibleMask :: (( forall a. WriterT w m a -> WriterT w m a) -> WriterT w m b) -> WriterT w m b Source # generalBracket :: WriterT w m a -> (a -> ExitCase b -> WriterT w m c) -> (a -> WriterT w m b) -> WriterT w m (b, c) Source # |
|
( MonadMask m, Monoid w) => MonadMask ( WriterT w m) | |
Defined in Control.Monad.Catch mask :: (( forall a. WriterT w m a -> WriterT w m a) -> WriterT w m b) -> WriterT w m b Source # uninterruptibleMask :: (( forall a. WriterT w m a -> WriterT w m a) -> WriterT w m b) -> WriterT w m b Source # generalBracket :: WriterT w m a -> (a -> ExitCase b -> WriterT w m c) -> (a -> WriterT w m b) -> WriterT w m (b, c) Source # |
|
( MonadMask m, Monoid w) => MonadMask ( RWST r w s m) | |
Defined in Control.Monad.Catch mask :: (( forall a. RWST r w s m a -> RWST r w s m a) -> RWST r w s m b) -> RWST r w s m b Source # uninterruptibleMask :: (( forall a. RWST r w s m a -> RWST r w s m a) -> RWST r w s m b) -> RWST r w s m b Source # generalBracket :: RWST r w s m a -> (a -> ExitCase b -> RWST r w s m c) -> (a -> RWST r w s m b) -> RWST r w s m (b, c) Source # |
|
( MonadMask m, Monoid w) => MonadMask ( RWST r w s m) | |
Defined in Control.Monad.Catch mask :: (( forall a. RWST r w s m a -> RWST r w s m a) -> RWST r w s m b) -> RWST r w s m b Source # uninterruptibleMask :: (( forall a. RWST r w s m a -> RWST r w s m a) -> RWST r w s m b) -> RWST r w s m b Source # generalBracket :: RWST r w s m a -> (a -> ExitCase b -> RWST r w s m c) -> (a -> RWST r w s m b) -> RWST r w s m (b, c) Source # |
mask_ :: MonadMask m => m a -> m a Source #
Like
mask
, but does not pass a
restore
action to the argument.
uninterruptibleMask_ :: MonadMask m => m a -> m a Source #
Like
uninterruptibleMask
, but does not pass a
restore
action to the
argument.
catchIOError :: MonadCatch m => m a -> ( IOError -> m a) -> m a Source #
Catch all
IOError
(eqv.
IOException
) exceptions. Still somewhat too
general, but better than using
catchAll
. See
catchIf
for an easy way
of catching specific
IOError
s based on the predicates in
System.IO.Error
.
handleIOError :: MonadCatch m => ( IOError -> m a) -> m a -> m a Source #
Flipped
catchIOError
class ( Typeable e, Show e) => Exception e where Source #
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 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 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 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 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
Nothing
toException :: e -> SomeException Source #
fromException :: SomeException -> Maybe e Source #
displayException :: e -> String Source #
Render this exception value in a human-friendly manner.
Default implementation:
.
show
Since: base-4.8.0.0
Instances
class Typeable (a :: k) Source #
The class
Typeable
allows a concrete representation of a type to
be calculated.
typeRep#
data SomeException Source #
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
.
Exception e => SomeException e |
Instances
Show SomeException |
Since: base-3.0 |
Defined in GHC.Exception.Type |
|
Exception SomeException |
Since: base-3.0 |
Defined in GHC.Exception.Type |
data SomeAsyncException Source #
Superclass for asynchronous exceptions.
Since: base-4.7.0.0
Exception e => SomeAsyncException e |
Instances
Show SomeAsyncException |
Since: base-4.7.0.0 |
Defined in GHC.IO.Exception |
|
Exception SomeAsyncException |
Since: base-4.7.0.0 |
Defined in GHC.IO.Exception |
data IOException Source #
Exceptions that occur in the
IO
monad.
An
IOException
records a more specific error type, a descriptive
string and maybe the handle that was used when the error was
flagged.
Instances
Eq IOException |
Since: base-4.1.0.0 |
Defined in GHC.IO.Exception (==) :: IOException -> IOException -> Bool Source # (/=) :: IOException -> IOException -> Bool Source # |
|
Show IOException |
Since: base-4.1.0.0 |
Defined in GHC.IO.Exception |
|
Exception IOException |
Since: base-4.1.0.0 |
Defined in GHC.IO.Exception toException :: IOException -> SomeException Source # fromException :: SomeException -> Maybe IOException Source # displayException :: IOException -> String Source # |
|
Error IOException | |
Defined in Control.Monad.Trans.Error noMsg :: IOException Source # strMsg :: String -> IOException Source # |
assert :: Bool -> a -> a Source #
If the first argument evaluates to
True
, then the result is the
second argument. Otherwise an
AssertionFailed
exception
is raised, containing a
String
with the source file and line number of the
call to
assert
.
Assertions can normally be turned on or off with a compiler flag
(for GHC, assertions are normally on unless optimisation is turned on
with
-O
or the
-fignore-asserts
option is given). When assertions are turned off, the first
argument to
assert
is ignored, and the second argument is
returned as the result.