X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=System%2FExit.hs;h=6de82c33aa9dee9dca5411f69aa39d7bf2b3c2a0;hb=ca4fc090b0ad583d07017a69430227ce32684ac0;hp=1dab14f732ae8fbc5e8116ad375ee13a982fb6d1;hpb=dbe5ad2718b2133d8c4205589905cf14acd73dcf;p=ghc-base.git diff --git a/System/Exit.hs b/System/Exit.hs index 1dab14f..6de82c3 100644 --- a/System/Exit.hs +++ b/System/Exit.hs @@ -13,21 +13,23 @@ ----------------------------------------------------------------------------- module System.Exit - ( + ( ExitCode(ExitSuccess,ExitFailure) , exitWith -- :: ExitCode -> IO a , exitFailure -- :: IO a + , exitSuccess -- :: IO a ) where import Prelude #ifdef __GLASGOW_HASKELL__ -import GHC.IOBase +import GHC.IO +import GHC.IO.Exception #endif #ifdef __HUGS__ -import Hugs.Prelude -import Hugs.Exception +import Hugs.Prelude (ExitCode(..)) +import Control.Exception.Base #endif #ifdef __NHC__ @@ -40,7 +42,7 @@ import System -- --------------------------------------------------------------------------- -- exitWith --- | Computation 'exitWith' @code@ throws 'ExitException' @code@. +-- | Computation 'exitWith' @code@ throws 'ExitCode' @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. @@ -50,20 +52,25 @@ import System -- 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 +-- As an 'ExitCode' 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 +-- 'catch' from the "Prelude". However it is a 'SomeException', and can -- be caught using the functions of "Control.Exception". This means -- that cleanup computations added with 'Control.Exception.bracket' -- (from "Control.Exception") are also executed properly on 'exitWith'. - +-- +-- Note: in GHC, 'exitWith' should be called from the main program +-- thread in order to exit the process. When called from another +-- thread, 'exitWith' will throw an 'ExitException' as normal, but the +-- exception will not cause the process itself to exit. +-- #ifndef __NHC__ exitWith :: ExitCode -> IO a -exitWith ExitSuccess = throwIO (ExitException ExitSuccess) +exitWith ExitSuccess = throwIO ExitSuccess exitWith code@(ExitFailure n) - | n /= 0 = throwIO (ExitException code) + | n /= 0 = throwIO code #ifdef __GLASGOW_HASKELL__ - | otherwise = ioError (IOError Nothing InvalidArgument "exitWith" "ExitFailure 0" Nothing) + | otherwise = ioError (IOError Nothing InvalidArgument "exitWith" "ExitFailure 0" Nothing Nothing) #endif #endif /* ! __NHC__ */ @@ -72,3 +79,9 @@ exitWith code@(ExitFailure n) -- where /exitfail/ is implementation-dependent. exitFailure :: IO a exitFailure = exitWith (ExitFailure 1) + +-- | The computation 'exitSuccess' is equivalent to +-- 'exitWith' 'ExitSuccess', It terminates the program +-- sucessfully. +exitSuccess :: IO a +exitSuccess = exitWith ExitSuccess