
On Tuesday 29 July 2003 2:06 pm, Bayley, Alistair wrote:
I've got resource acquisition (and release) code which looks like this at [...] How should I structure it to handle exceptions raised by the various functions (envCreate, handleAlloc, dbLogon, etc)?
Use the bracket, bracket_ and finally functions. For example: bracket (open "/etc/lilo.conf") close $ \ hLILO -> bracket (open "/etc/passwd") close $ \ hPasswd-> <do something with the two file handles here> I find it is often useful to package up common patterns like opening a file, creating a window, loading a font, etc like this: withFile :: Pathname -> (Handle -> IO a) -> IO a withFile path = bracket (open path) close withFont :: FontSpec -> (Font -> IO a) -> IO a withFont spec = bracket (loadFont spec) deleteFont ... You can see this style being used a lot in the HGL documentation from about section 2.2 (page 3) onwards: http://haskell.cs.yale.edu/graphics/downloads/graphics-2.0.4.ps (The HGL is the library that motivated me to add exception handling to Hugs.) -- Alastair Reid