[Haskell-cafe] Using catch and errors
Lemmih
lemmih at gmail.com
Fri Apr 22 11:04:42 EDT 2005
On 4/22/05, Alexandre Weffort Thenorio <alethenorio at home.se> wrote:
> I am trying to get catch to work but I guess I am total newbie on this one.
>
> main :: IO()
> main = do
> removeFile "./newint.hex"
> hexFile <- catch (readFile int.hex) (\_ -> do putStrLn "Cannot find
> int.hex"
> getLine --Simply stop program so user can read error message
> return() --Quit)
> hexFile <- readFile "int.hex"
> --res of program goes here
> getLine
> return()
>
> But it keeps giving me error on getLine. How can I quit a program in case of
> an error giving an error message?
Try:
main :: IO ()
main =
do removeFile "./newint.hex"
hexFile <- catch (readFile "int.hex") (\_ -> error "Cannot find int.hex")
getLine
return ()
Notice that 'return' in Haskell is very different from 'return' in C.
> Also I tried something like
>
> main :: IO()
> main = do
> ex <- doesFileExist "./newint.hex"
> if ex then removeFile "./newint.hex"
>
> But that won't work either. Any ideas? I'd like to catch different errors
> and quit program giving different error messages
'if/then/else' expressions _must_ have an 'else' part. In this case
you can use 'Control.Monad.when': 'when ex (removeFile "newint.hex")'.
> Last but not least I have the function
>
> outputLine keyno key orgFile = do
> let part1 = getLeft keyno (orgFile!!1)
> let part2 = getRight keyno (orgFile!!1)
> let total = part1 ++ (map toUpper key) ++ part2
> let checks = checksum (drop 1 total)
> let final = total ++ checks ++ "\n"
> newHexFile <- openFile "newint.hex" WriteMode
> hPutStrLn newHexFile (orgFile!!0 ++ "\n" ++ final ++ unlines (drop 2
> orgFile))
>
> I'd like to be able to check for stuff such as size of key and wheter keyno
> is only 1 or 0 and quit program with error message otherwise but again
> couldn't quite get catch to work.
You can use pattern matches and guards for that.
outputLine keyno key (orgFile1:orgFile2:restOfOrgFile)
| length key == someKeyLength
= your code here
| otherwise
= error "Invalid key length"
outputLine keyno key orgFile
= error "invalid orgFile"
I'm not sure what you use 'keyno' for but perhaps you could define a
'data Keyno = Zero | One' data type and catch such errors at
compile-time?
> Any reading tips about subject would be appreciated.
I've heard "Yet Another Haskell Tutorial" should be good but I've
never read it myself. You can download it from
http://www.isi.edu/~hdaume/htut/
--
Friendly,
Lemmih
More information about the Haskell-Cafe
mailing list