X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Prelude.hs;fp=Prelude.hs;h=8eb912bffa412d9ee568f4dccf7336d1cd258d48;hb=8e9892cd14b7558649fcd9ba0597805eb57505b3;hp=ff3902a1f4502e38000f5d6393e878ea2de8bb8e;hpb=b3768993c0fa634d54a15a0eefa370208110be21;p=ghc-base.git diff --git a/Prelude.hs b/Prelude.hs index ff3902a..8eb912b 100644 --- a/Prelude.hs +++ b/Prelude.hs @@ -170,6 +170,8 @@ import GHC.Show import GHC.Err ( error, undefined ) #endif +import qualified Control.OldException as Old + #ifdef __HUGS__ import Hugs.Prelude #endif @@ -192,3 +194,27 @@ f $! x = x `seq` f x seq :: a -> b -> b seq _ y = y #endif + +-- | The 'catch' function establishes a handler that receives any 'IOError' +-- raised in the action protected by 'catch'. An 'IOError' is caught by +-- the most recent handler established by 'catch'. These handlers are +-- not selective: all 'IOError's are caught. Exception propagation +-- must be explicitly provided in a handler by re-raising any unwanted +-- exceptions. For example, in +-- +-- > f = catch g (\e -> if IO.isEOFError e then return [] else ioError e) +-- +-- the function @f@ returns @[]@ when an end-of-file exception +-- (cf. 'System.IO.Error.isEOFError') occurs in @g@; otherwise, the +-- exception is propagated to the next outer handler. +-- +-- When an exception propagates outside the main program, the Haskell +-- system prints the associated 'IOError' value and exits the program. +-- +-- Non-I\/O exceptions are not caught by this variant; to catch all +-- exceptions, use 'Control.Exception.catch' from "Control.Exception". +catch :: IO a -> (IOError -> IO a) -> IO a +catch io handler = io `Old.catch` handler' + where handler' (Old.IOException ioe) = handler ioe + handler' e = throw e +