[EMAIL PROTECTED] writes: >I am trying to emulate bash in haskell, and i got a function called shell that waits >fot the command and then executes it. The problem is that if the file does not exist, >the program returns to Main (it gets out of the shell). The only thing i want to do >is to return to the shell after an IOError. > >How can i perform such a thing?
You could test if the file exists, like you said before, but that test would fail once in a while, when another process deletes the file after your test but before the file is opened. This is called a "race condition" and should be avoided when possible. The best thing is to use catch which has the type IO a -> (IOError -> IO a) -> IO a. An example (untested code) is catch (do hdl<-openFile "/home/bracaman/foo" ReadMode char<-hGetChar hdl string<-hGetLine hdl ) --we caught an exception: (\errorCode-> if isDoesNotExistError errorCode then "return to shell" else if isPermissionError errorCode then "return to shell" else --something strange happened. --re-raise the exception, which will probably return control to Main. ioError errorCode ) P.S. Instead of (do hdl<-openFile "/home/bracaman/foo" ReadMode char<-hGetChar hdl string<-hGetLine hdl ... ) you could have (do fileContentsAsABigString<-readFile "/home/bracaman/foo" ... ) but I try to stay away from readFile and getContents because they're not referentially transparent. _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe