| Copyright | (c) 2009-2016, Peter Trško |
|---|---|
| License | BSD3 |
| Stability | provisional |
| Portability | non-portable (CPP, NoImplicitPrelude, depends on non-portable module) |
| Safe Haskell | Safe |
| Language | Haskell2010 |
Control.Monad.TaggedException.Hidden
Contents
Description
- class Exception e => HiddenException e where
- hideException :: MonadThrow m => Throws e m a -> m a
- hideWith :: (Exception e, HiddenException e', MonadCatch m) => (e -> e') -> Throws e m a -> m a
- throwHidden :: (HiddenException e, MonadThrow m) => e -> m a
- throw' :: (HiddenException e, MonadThrow m) => e -> m a
HiddenException class
Since HiddenException provides default implementation for hide
method making instances of it is trivial. Example of how to create
instance of HiddenException:
data MyException = MyException String
deriving (Typeable)
instance Show MyException where
showsPrec _ (MyException msg) =
showString "MyException: " . shows msg
instance Exception MyException
instance HiddenException MyExceptionclass Exception e => HiddenException e where Source
Class for exception that can be removed from the type signature. Default
implementation for hideException method is provided.
Minimal complete definition
Nothing
Instances
Mapping existing visible exception to hidden ones
This is a prefered way of hiding exceptions. Difference from just hiding the type tag and mapping it in to hidden exception is that in later case we can provide additional information. Most important is to specify why that particluar exception was hidden.
Example:
data UnrecoverableException
= UnrecoverableIOException String IOException
deriving (Typeable)
instance Show UnrecoverableException where
showsPrec _ (UnrecoverableIOException info e)
showString "Unrecoverable exception occurred in "
. showString info . showString ": " . shows e
instance Exception UnrecoverableException
instance HiddenException UnrecoverableException
hideIOException
:: (MonadCatch e)
=> String
-> Throws IOException m a
-> m a
hideIOException = hideWith . UnrecoverableIOExceptionhideWith :: (Exception e, HiddenException e', MonadCatch m) => (e -> e') -> Throws e m a -> m a Source
Map exception before hiding it.
This is the preferred way to do exception hiding, by mapping it in to a different exception that better describes its fatality.
Raising hidden exceptions
throwHidden :: (HiddenException e, MonadThrow m) => e -> m a Source
Throw exceptions and then disregard type tag.
throw' :: (HiddenException e, MonadThrow m) => e -> m a Source
Alias for throwHidden.