1 % ------------------------------------------------------------------------------
2 % $Id: PrelException.lhs,v 1.22 2000/07/07 11:03:58 simonmar Exp $
4 % (c) The University of Glasgow, 1998-2000
7 Exceptions and exception-handling functions.
10 {-# OPTIONS -fno-implicit-prelude #-}
14 ( module PrelException,
15 Exception(..), AsyncException(..),
16 IOException(..), ArithException(..), ArrayException(..),
27 %*********************************************************
29 \subsection{Primitive catch}
31 %*********************************************************
33 catchException used to handle the passing around of the state to the
34 action and the handler. This turned out to be a bad idea - it meant
35 that we had to wrap both arguments in thunks so they could be entered
36 as normal (remember IO returns an unboxed pair...).
40 catch# :: IO a -> (b -> IO a) -> IO a
42 (well almost; the compiler doesn't know about the IO newtype so we
43 have to work around that in the definition of catchException below).
46 catchException :: IO a -> (Exception -> IO a) -> IO a
48 catchException m k = ST (\s -> unST m s `primCatch'` \ err -> unST (k err) s)
50 catchException (IO m) k = IO $ \s -> catch# m (\ex -> unIO (k ex)) s
53 catch :: IO a -> (Exception -> IO a) -> IO a
54 catch m k = catchException m handler
55 where handler err@(IOException _) = k err
56 handler other = throw other
60 %*********************************************************
62 \subsection{Try and bracket}
64 %*********************************************************
66 The construct @try comp@ exposes errors which occur within a
67 computation, and which are not fully handled. It always succeeds.
69 These are the IO-only try/bracket. For the full exception try/bracket
70 see hslibs/lang/Exception.lhs.
73 try :: IO a -> IO (Either Exception a)
74 try f = catch (do r <- f
78 bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
79 bracket before after m = do
87 -- variant of the above where middle computation doesn't want x
88 bracket_ :: IO a -> (a -> IO b) -> IO c -> IO c
89 bracket_ before after m = do
99 %*********************************************************
101 \subsection{Controlling asynchronous exception delivery}
103 %*********************************************************
107 blockAsyncExceptions :: IO a -> IO a
108 blockAsyncExceptions (IO io) = IO $ blockAsyncExceptions# io
110 unblockAsyncExceptions :: IO a -> IO a
111 unblockAsyncExceptions (IO io) = IO $ unblockAsyncExceptions# io
113 -- Not implemented yet in Hugs.
114 blockAsyncExceptions :: IO a -> IO a
115 blockAsyncExceptions (IO io) = IO io
117 unblockAsyncExceptions :: IO a -> IO a
118 unblockAsyncExceptions (IO io) = IO io