X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=System%2FIO%2FError.hs;h=372bb152622c658e075245d9e0d1813a9ca45bea;hb=37ab854f9d2c1280117658bbd29919968f4f4585;hp=a4c5b599c0a905b93b504afc9d463a468c074be1;hpb=a05bf117a16bfdc68ae9782e16ad9616f0ece396;p=ghc-base.git diff --git a/System/IO/Error.hs b/System/IO/Error.hs index a4c5b59..372bb15 100644 --- a/System/IO/Error.hs +++ b/System/IO/Error.hs @@ -90,9 +90,13 @@ module System.IO.Error ( #endif ) where -import {-# SOURCE #-} Prelude (catch) +#ifndef __HUGS__ +import qualified Control.Exception.Base as New (catch) +#endif +#ifndef __HUGS__ import Data.Either +#endif import Data.Maybe #ifdef __GLASGOW_HASKELL__ @@ -102,11 +106,10 @@ import Text.Show #endif #ifdef __HUGS__ -import Hugs.Prelude(Handle, IOException(..), IOErrorType(..)) +import Hugs.Prelude(Handle, IOException(..), IOErrorType(..), IO) #endif #ifdef __NHC__ -import Prelude import IO ( IOError () , try @@ -154,6 +157,9 @@ mkIOError t location maybe_hdl maybe_filename = IOError{ ioe_type = t, ioe_location = location, ioe_description = "", +#if defined(__GLASGOW_HASKELL__) + ioe_errno = Nothing, +#endif ioe_handle = maybe_hdl, ioe_filename = maybe_filename } @@ -369,8 +375,9 @@ annotateIOError :: IOError -> Maybe Handle -> Maybe FilePath -> IOError -annotateIOError (IOError ohdl errTy _ str opath) loc hdl path = - IOError (hdl `mplus` ohdl) errTy loc str (path `mplus` opath) +annotateIOError ioe loc hdl path = + ioe{ ioe_handle = hdl `mplus` ioe_handle ioe, + ioe_location = loc, ioe_filename = path `mplus` ioe_filename ioe } where Nothing `mplus` ys = ys xs `mplus` _ = xs @@ -386,3 +393,26 @@ annotateIOError (UserError loc msg) msg' file' hdl' = annotateIOError (PatternError loc) msg' file' hdl' = PatternError (loc++'\n':msg') #endif + +#ifndef __HUGS__ +-- | 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 = New.catch +#endif /* !__HUGS__ */