
Hello Simon, On 2013-12-14 at 11:56:11 +0100, Simon Hengel wrote:
I propose to add
die :: String -> IO () die err = hPutStrLn stderr err >> exitFailure
to System.Exit.
Why not simply use the existing `fail :: String -> IO a` method instead? The differences & similiarities I see wrt `fail`: - `die` throws an `ExitCode` exception, whereas `fail` throws an `IOError` exception - Both result in the message written to stderr and a non-zero exit code - As both use exceptions, `die` does guarantee termination (as it can be caught) - `die` writes to stderr at invocation time, whereas `fail` attaches the message to the exception, which is then output by the top exception handler. Due to that, catching a `die`-caused exception will print the termination message even though the process-exit was cancelled. Whereas attaching the message to the exception allows for more flexibility as well as for atomicity wrt message-output and termination. - `fail` is available from Prelude (and part of Haskell98/2010), whereas `System.Exit.die` would require an import of "System.Exit" (with the small risk of breaking code that expects only Haskell2010-known entities exported by "System.Exit") Therefore I'm not convinced (yet), that the suggested `die` implementation has sensible semantics in the context of exceptions, and that it offers enough benefits over the already existing `fail` method. Cheers, hvr