| Safe Haskell | Safe |
|---|---|
| Language | Haskell98 |
UnexceptionalIO
Description
When you've caught all the exceptions that can be handled safely, this is what you're left with.
runEitherIO . fromIO ≡ id
It is intended that you use qualified imports with this library.
import UnexceptionalIO (UIO) import qualified UnexceptionalIO as UIO
- data UIO a
- class Monad m => Unexceptional m where
- fromIO :: Unexceptional m => IO a -> m (Either SomeNonPseudoException a)
- run :: UIO a -> IO a
- runEitherIO :: Exception e => UIO (Either e a) -> IO a
- fromIO' :: (Exception e, Unexceptional m) => IO a -> m (Either e a)
- unsafeFromIO :: Unexceptional m => IO a -> m a
- data SomeNonPseudoException
- data PseudoException
- data ProgrammerError
- = TypeError TypeError
- | ArithException ArithException
- | ArrayException ArrayException
- | AssertionFailed AssertionFailed
- | ErrorCall ErrorCall
- | NestedAtomically NestedAtomically
- | NoMethodError NoMethodError
- | PatternMatchFail PatternMatchFail
- | RecConError RecConError
- | RecSelError RecSelError
- | RecUpdError RecSelError
- data ExternalError
- bracket :: Unexceptional m => UIO a -> (a -> UIO ()) -> (a -> UIO c) -> m c
- forkFinally :: Unexceptional m => UIO a -> (Either PseudoException a -> UIO ()) -> m ThreadId
- fork :: Unexceptional m => UIO () -> m ThreadId
Documentation
IO without any PseudoException
class Monad m => Unexceptional m where Source #
Polymorphic base without any PseudoException
Minimal complete definition
Instances
fromIO :: Unexceptional m => IO a -> m (Either SomeNonPseudoException a) Source #
Catch any exception but PseudoException in an IO action
Unsafe entry points
fromIO' :: (Exception e, Unexceptional m) => IO a -> m (Either e a) Source #
You promise that e covers all exceptions but PseudoException
thrown by this IO action
This function is partial if you lie
unsafeFromIO :: Unexceptional m => IO a -> m a Source #
You promise there are no exceptions but PseudoException thrown by this IO action
Pseudo exceptions
data SomeNonPseudoException Source #
Every SomeException but PseudoException
data PseudoException Source #
Not everything handled by the exception system is a run-time error you can handle. This is the class of pseudo-exceptions you usually can do nothing about, just log or exit.
Additionally, except for ExitCode any of these psuedo-exceptions
you could never guarentee to have caught, since they can come
from anywhere at any time, we could never guarentee that UIO does
not contain them.
Constructors
| ProgrammerError ProgrammerError | Mistakes programmers make |
| ExternalError ExternalError | Errors thrown by the runtime |
| Exit ExitCode | Process exit requests |
Instances
data ProgrammerError Source #
Constructors
Instances
data ExternalError Source #
Pseudo-exceptions thrown by the runtime environment
Constructors
Instances
Pseudo exception helpers
bracket :: Unexceptional m => UIO a -> (a -> UIO ()) -> (a -> UIO c) -> m c Source #
When you're doing resource handling, PseudoException matters.
You still need to use the bracket pattern to handle cleanup.
forkFinally :: Unexceptional m => UIO a -> (Either PseudoException a -> UIO ()) -> m ThreadId Source #
Mirrors forkFinally, but since the body is UIO,
the thread must terminate successfully or because of PseudoException
fork :: Unexceptional m => UIO () -> m ThreadId Source #
Mirrors forkIO, but re-throws any PseudoException
to the parent thread