This is just like Control.Monad.Error.Class except you can throw/catch the error of any ErrorT in the monad stack instead of just the top one as long as the error types are different. If two or more ErrorTs in the stack have the same error type you get the error of the top one.
MonadError but without functional dependency so the same monad can have multiple errors with different types
Abort action and throw give exception. Analogous to
If first action aborts with exception then execute second action. Analogous to