Run a computation which can throw errors with a handler to run on
error.
Errors thrown by the handler will escape up to the nearest enclosing
catchError (if any). Note that this effect does
not
handle errors thrown from impure contexts such as IO, nor will it
handle exceptions thrown from pure code. If you need to handle
IO-based errors, consider if
fused-effects-exceptions fits
your use case; if not, use
liftIO with
try or use
catch from outside the effect invocation.
runError (throwError e catchError f) = runError (f e)