Safe Haskell | None |
---|
Control.Exception.Hierarchical
Description
Control.Exception leverages Data.Typeable to fake subtyping and thereby give Haskell support for hierarchies of exceptions. However, defining exception hierarchies requires quite a bit of boilerplate. For instance, to define
- a top-level exception,
TracerException
, - a sub-exception,
TimingFailure
, and - a sub-exception,
WriteFailure
,
requires several paragraphs of code:
import Control.Exception import Data.Typeable (Typeable, cast) data TracerException = forall e. Exception e => TracerException e deriving Typeable instance Show TracerException where show (TracerException e) = show e instance Exception TracerException data TimingFailure = TimingFailure deriving (Show, Typeable) instance Exception TimingFailure where toException = toException . TracerException fromException x = do TracerException a <- fromException x cast a data WriteFailure = WriteFailure deriving (Show, Typeable) instance Exception WriteFailure where toException = toException . TracerException fromException x = do TracerException a <- fromException x cast a
Instead of writing this, one could simply write
import Control.Exception (SomeException(SomeException)) import Control.Exception.Hierarchical mkAbstractException 'SomeException "TracerException" mkException 'TracerException "TimingFailure" mkException 'TracerException "WriteFailure"
and allow Template Haskell to fill in the rest.
This libray deals with two types of exceptions: abstract and concrete
exceptions. Both types can be caught with catch
and other
associated functions; however, only you may only extend abstract exceptions,
and you may only throw concrete ones. This is a fundamental limitation of the
Haskell exception hierarchy system as it currently exists.
- mkAbstractException :: Name -> String -> DecsQ
- mkException :: Name -> String -> DecsQ
Documentation
Arguments
:: Name | the name of the super-exception’s data constructor |
-> String | the name of the exception to create |
-> DecsQ |
Creates an abstract sub-exception of an existing exception. As discussed in the introduction, such an exception cannot be thrown; it can only be extended.