diff options
author | 2011-11-10 20:24:24 -0400 | |
---|---|---|
committer | 2011-11-10 20:57:28 -0400 | |
commit | 49d2177d51b95b4a01c05ee07e166e93751b4c51 (patch) | |
tree | b818865e5a924dc90bf0a79608351b1aeffe458a /Utility | |
parent | a71c03bc5162916853ff520d5c7c89e849c6a047 (diff) |
factored out some useful error catching methods
Diffstat (limited to 'Utility')
-rw-r--r-- | Utility/Misc.hs | 21 | ||||
-rw-r--r-- | Utility/TempFile.hs | 4 |
2 files changed, 21 insertions, 4 deletions
diff --git a/Utility/Misc.hs b/Utility/Misc.hs index 4c4aa4c93..728598723 100644 --- a/Utility/Misc.hs +++ b/Utility/Misc.hs @@ -8,7 +8,9 @@ module Utility.Misc where import System.IO +import System.IO.Error (try) import Control.Monad +import Control.Applicative {- A version of hgetContents that is not lazy. Ensures file is - all read before it gets closed. -} @@ -26,5 +28,20 @@ readMaybe s = case reads s of _ -> Nothing {- Catches IO errors and returns a Bool -} -catchBool :: IO Bool -> IO Bool -catchBool = flip catch (const $ return False) +catchBoolIO :: IO Bool -> IO Bool +catchBoolIO a = catchDefaultIO a False + +{- Catches IO errors and returns a Maybe -} +catchMaybeIO :: IO a -> IO (Maybe a) +catchMaybeIO a = catchDefaultIO (Just <$> a) Nothing + +{- Catches IO errors and returns a default value. -} +catchDefaultIO :: IO a -> a -> IO a +catchDefaultIO a def = catch a (const $ return def) + +{- Catches IO errors and returns the error message. -} +catchMsgIO :: IO a -> IO (Either String a) +catchMsgIO a = dispatch <$> try a + where + dispatch (Left e) = Left $ show e + dispatch (Right v) = Right v diff --git a/Utility/TempFile.hs b/Utility/TempFile.hs index 1e823c10e..8d50dd8b2 100644 --- a/Utility/TempFile.hs +++ b/Utility/TempFile.hs @@ -31,9 +31,9 @@ withTempFile :: String -> (FilePath -> Handle -> IO a) -> IO a withTempFile template a = bracket create remove use where create = do - tmpdir <- catch getTemporaryDirectory (const $ return ".") + tmpdir <- catchDefaultIO getTemporaryDirectory "." openTempFile tmpdir template remove (name, handle) = do hClose handle - catchBool (removeFile name >> return True) + catchBoolIO (removeFile name >> return True) use (name, handle) = a name handle |