我正在Haskell从事一个学生项目,而getLine的行为存在问题。 这是代码(简体):
main :: IO()
main = do
str <- getLine
putStrLn str
我想做的是,当用户按下Ctrl + D时,能够退出With(退出失败84)。 getLine只会输出错误并退出程序(并返回1)
deBruijn: <stdin>: hGetLine: end of file
如何更改此行为?我只想将退出值更改为84。
答案 0 :(得分:7)
您的程序永远看不到Control-D。 看到的是标准输入已经关闭的事实,在这种情况下,是您的 terminal 响应于键入Control-D而关闭的。这意味着您要在getLine
尝试从关闭的文件读取一行之前捕获EOF条件。
import System.IO
import System.Exit
main :: IO ()
main = do
isClosed <- isEOF
if isClosed
then exitWith (ExitFailure 84)
else getLine >>= putStrLn
答案 1 :(得分:1)
代替手动检查isEof
,您可以捕获发生的IO异常:
import Control.Exception (catch)
import System.IO.Error(isEOFError)
import System.Exit
tryMain :: IO ()
tryMain = getLine >>= putStrLn
main :: IO ()
main = tryMain `catch` (\e ->
if isEOFError e
then exitWith (ExitFailure 84)
else exitWith (ExitFailure 99))
通常您不能提前排除IO异常,所以这是我推荐的方法。