asynchronous-exceptions-1.1: Distinguish between synchronous and asynchronous exceptions

Safe HaskellSafe-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.

Synopsis

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

trySync :: IO b -> IO (Either SomeException b)Source

Like try, but catch any synchronous exceptions; let asynchronous ones pass through