Safe Haskell | Safe-Inferred |
---|
Control.Exception.Async
Contents
Description
It is often useful to distinguish between synchronous and asynchronous exceptions. The common idiom is to run a user-supplied computation catching any synchronous exceptions but allowing asynchronous exceptions (such as user interrupt) pass through.
There's no way to know how — synchronously or asynchronously — an exception was thrown, so we have to work around it by relying on the exception type itself.
This module provides an extensible type for asynchronous exceptions
— SomeAsyncException
— as well as functions for catching synchronous
exceptions.
- data SomeAsyncException
- asyncExceptionToException :: Exception e => e -> SomeException
- asyncExceptionFromException :: Exception e => SomeException -> Maybe e
- isAsynchronous :: SomeException -> Bool
- catchSync :: IO a -> (SomeException -> IO a) -> IO a
- handleSync :: (SomeException -> IO a) -> IO a -> IO a
- trySync :: IO b -> IO (Either SomeException b)
Exception class for asynchronous exceptions
To mark an exception as asynchronous:
instance Exception MyException where fromException = asyncFromException toException = asyncToException
Note that until base 4.7 (GHC 7.8) AsyncException
was not a subclass
of SomeAsyncException
. Use isAsynchronous
to recognize both
AsyncException
and SomeAsyncException
.
The re-exported documentation may say «Since: 4.7.0.0» — ignor that. For older versions this package provides its own compatible definitions.
data SomeAsyncException Source
Exception class for asynchronous exceptions
asyncExceptionToException :: Exception e => e -> SomeExceptionSource
toException
implementation for asynchronous exceptions
asyncExceptionFromException :: Exception e => SomeException -> Maybe eSource
fromException
implementation for asynchronous exceptions
Detecting asynchronous exceptions
isAsynchronous :: SomeException -> BoolSource
Check whether an exception is asynchronous
Catching synchronous exceptions
catchSync :: IO a -> (SomeException -> IO a) -> IO aSource
Like catch
, but catch any synchronous exceptions; let asynchronous ones pass through
handleSync :: (SomeException -> IO a) -> IO a -> IO aSource
Like handle
, but catch any synchronous exceptions; let asynchronous ones pass through