X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Control%2FException.hs;h=1a407809548f6c659329bd9e6522473d89253cad;hb=c1a7d1856f1af6450ae3e04072b9d36960bc2257;hp=ee063de8848df7eee72307c227638eda6cff8722;hpb=2570f264ed329f04017d507250494eb0ab680d64;p=haskell-directory.git diff --git a/Control/Exception.hs b/Control/Exception.hs index ee063de..1a40780 100644 --- a/Control/Exception.hs +++ b/Control/Exception.hs @@ -11,6 +11,18 @@ -- This module provides support for raising and catching both built-in -- and user-defined exceptions. -- +-- In addition to exceptions thrown by 'IO' operations, exceptions may +-- be thrown by pure code (imprecise exceptions) or by external events +-- (asynchronous exceptions), but may only be caught in the 'IO' monad. +-- For more details, see: +-- +-- * /A semantics for imprecise exceptions/, by Simon Peyton Jones, +-- Alastair Reid, Tony Hoare, Simon Marlow, Fergus Henderson, +-- in /PLDI'99/. +-- +-- * /Asynchronous exceptions in Haskell/, by Simon Marlow, Simon Peyton +-- Jones, Andy Moran and John Reppy, in /PLDI'01/. +-- ----------------------------------------------------------------------------- module Control.Exception ( @@ -140,7 +152,7 @@ import Data.Dynamic -- argument. Otherwise, the result is returned as normal. For example: -- -- > catch (openFile f ReadMode) --- > (\e -> hPutStr stderr (\"Couldn\'t open \"++f++\": \" ++ show e)) +-- > (\e -> hPutStr stderr ("Couldn't open "++f++": " ++ show e)) -- -- For catching exceptions in pure (non-'IO') expressions, see the -- function 'evaluate'. @@ -166,11 +178,19 @@ import Data.Dynamic -- Also note that the "Prelude" also exports a function called -- 'Prelude.catch' with a similar type to 'Control.Exception.catch', -- except that the "Prelude" version only catches the IO and user --- families of exceptions (as required by Haskell 98). We recommend --- either hiding the "Prelude" version of --- 'Prelude.catch' when importing --- "Control.Exception", or importing --- "Control.Exception" qualified, to avoid name-clashes. +-- families of exceptions (as required by Haskell 98). +-- +-- We recommend either hiding the "Prelude" version of 'Prelude.catch' +-- when importing "Control.Exception": +-- +-- > import Prelude hiding (catch) +-- +-- or importing "Control.Exception" qualified, to avoid name-clashes: +-- +-- > import qualified Control.Exception as C +-- +-- and then using @C.catch@ +-- catch :: IO a -- ^ The computation to run -> (Exception -> IO a) -- ^ Handler to invoke if an exception is raised @@ -231,7 +251,7 @@ mapException f v = unsafePerformIO (catch (evaluate v) -- @('Right' a)@ if no exception was raised, or @('Left' e)@ if an -- exception was raised and its value is @e@. -- --- > try a = catch (Right \`liftM\` a) (return . Left) +-- > try a = catch (Right `liftM` a) (return . Left) -- -- Note: as with 'catch', it is only polite to use this variant if you intend -- to re-throw the exception after performing whatever cleanup is needed. @@ -352,7 +372,7 @@ userErrors _ = Nothing -- The arguments to 'bracket' are in this order so that we can partially apply -- it, e.g.: -- --- > withFile name = bracket (openFile name) hClose +-- > withFile name mode = bracket (openFile name mode) hClose -- bracket :: IO a -- ^ computation to run first (\"acquire resource\") @@ -506,7 +526,8 @@ uncaughtExceptionHandler = unsafePerformIO (newIORef defaultHandler) withCString msg $ \cmsg -> errorBelch cfmt cmsg -foreign import ccall unsafe errorBelch :: CString -> CString -> IO () +foreign import ccall unsafe "RtsMessages.h errorBelch" + errorBelch :: CString -> CString -> IO () setUncaughtExceptionHandler :: (Exception -> IO ()) -> IO () setUncaughtExceptionHandler = writeIORef uncaughtExceptionHandler