enclosed-exceptions-1.0.2: Catching all exceptions from within an enclosed computation

Safe Haskell | Safe
Language | Haskell98

Control.Exception.Enclosed

Contents

- Exceptions
- Force types

Description

The purpose of this module is to allow you to capture all exceptions originating from within the enclosed computation, while still reacting to asynchronous exceptions aimed at the calling thread.

This way, you can be sure that the function that calls, for example, ``catchAny``, will still respond to ``ThreadKilled`` or ``Timeout`` events raised by another thread (with ``throwTo``), while capturing all exceptions, synchronous or asynchronous, resulting from the execution of the enclosed computation.

One particular use case is to allow the safe execution of code from various libraries (which you do not control), capturing any faults that might occur, while remaining responsive to higher level events and control actions.

This library was originally developed by Michael Snoyman for the `ClassyPrelude` library, and was latter 'spun-off' into a separate independent package.

For a more detailed explanation of the motivation behind this functions, see:

https://www.fpcomplete.com/user/snoyberg/general-haskell/exceptions/catching-all-exceptions

and

https://groups.google.com/forum/#!topic/haskell-cafe/e9H2I-3uVJE

Synopsis

- catchAny :: MonadBaseControl IO m => m a -> (SomeException -> m a) -> m a
- handleAny :: MonadBaseControl IO m => (SomeException -> m a) -> m a -> m a
- tryAny :: MonadBaseControl IO m => m a -> m (Either SomeException a)
- catchDeep :: (Exception e, NFData a, MonadBaseControl IO m) => m a -> (e -> m a) -> m a
- catchAnyDeep :: (NFData a, MonadBaseControl IO m) => m a -> (SomeException -> m a) -> m a
- handleAnyDeep :: (NFData a, MonadBaseControl IO m) => (SomeException -> m a) -> m a -> m a
- tryDeep :: (Exception e, NFData a, MonadBaseControl IO m) => m a -> m (Either e a)
- tryAnyDeep :: (NFData a, MonadBaseControl IO m) => m a -> m (Either SomeException a)
- catchIO :: MonadBaseControl IO m => m a -> (IOException -> m a) -> m a
- handleIO :: MonadBaseControl IO m => (IOException -> m a) -> m a -> m a
- tryIO :: MonadBaseControl IO m => m a -> m (Either IOException a)
- asIOException :: IOException -> IOException
- asSomeException :: SomeException -> SomeException

## Exceptions

catchAny :: MonadBaseControl IO m => m a -> (SomeException -> m a) -> m a #

A version of `catch` which is specialized for any exception. This simplifies usage as no explicit type signatures are necessary.

Note that since version 0.5.9, this function now has proper support for asynchronous exceptions, by only catching exceptions generated by the internal (enclosed) action.

Since 0.5.6

handleAny :: MonadBaseControl IO m => (SomeException -> m a) -> m a -> m a #

A version of `handle` which is specialized for any exception. This simplifies usage as no explicit type signatures are necessary.

Note that since version 0.5.9, this function now has proper support for asynchronous exceptions, by only catching exceptions generated by the internal (enclosed) action.

Since 0.5.6

tryAny :: MonadBaseControl IO m => m a -> m (Either SomeException a) #

A version of `try` which is specialized for any exception. This simplifies usage as no explicit type signatures are necessary.

Note that since version 0.5.9, this function now has proper support for asynchronous exceptions, by only catching exceptions generated by the internal (enclosed) action.

Since 0.5.6

catchDeep :: (Exception e, NFData a, MonadBaseControl IO m) => m a -> (e -> m a) -> m a #

An extension to `catch` which ensures that the return value is fully evaluated. See `tryAny`.

Since 1.0.1

catchAnyDeep :: (NFData a, MonadBaseControl IO m) => m a -> (SomeException -> m a) -> m a #

An extension to `catchAny` which ensures that the return value is fully evaluated. See `tryAnyDeep`.

Since 0.5.9

handleAnyDeep :: (NFData a, MonadBaseControl IO m) => (SomeException -> m a) -> m a -> m a #

    flip catchAnyDeep

Since 0.5.6

tryDeep :: (Exception e, NFData a, MonadBaseControl IO m) => m a -> m (Either e a) #

an extension to `try` which ensures that the return value is fully evaluated. in other words, if you get a `right` response here, you can be confident that using it will not result in another exception.

Since 1.0.1

tryAnyDeep :: (NFData a, MonadBaseControl IO m) => m a -> m (Either SomeException a) #

an extension to `tryany` which ensures that the return value is fully evaluated. in other words, if you get a `right` response here, you can be confident that using it will not result in another exception.

Since 0.5.9

catchIO :: MonadBaseControl IO m => m a -> (IOException -> m a) -> m a #

A version of `catch` which is specialized for IO exceptions. This simplifies usage as no explicit type signatures are necessary.

Since 0.5.6

handleIO :: MonadBaseControl IO m => (IOException -> m a) -> m a -> m a #

A version of `handle` which is specialized for IO exceptions. This simplifies usage as no explicit type signatures are necessary.

Since 0.5.6

tryIO :: MonadBaseControl IO m => m a -> m (Either IOException a) #

A version of `try` which is specialized for IO exceptions. This simplifies usage as no explicit type signatures are necessary.

Since 0.5.6

## Force types

Helper functions for situations where type inferer gets confused.

asIOException :: IOException -> IOException #

Since 0.5.6

asSomeException :: SomeException -> SomeException #

Since 0.5.6