Computation exitWith code throws ExitException code.
Normally this terminates the program, returning code to the
program's caller. Before the program terminates, any open or
semi-closed handles are first closed.
A program that fails in any other way is treated as if it had
A program that terminates successfully without calling exitWith
explicitly is treated as it it had called exitWith ExitSuccess.
As an ExitException is not an IOError, exitWith bypasses
the error handling in the IO monad and cannot be intercepted by
catch from the Prelude. However it is an Exception, and can
be caught using the functions of Control.Exception. This means
that cleanup computations added with bracket
(from Control.Exception) are also executed properly on exitWith.