在Haskell中更改getLine异常的退出值

时间:2019-03-10 18:50:56

标签: haskell

我正在Haskell从事一个学生项目,而getLine的行为存在问题。 这是代码(简体):

main :: IO()
main = do
str <- getLine
putStrLn str

我想做的是,当用户按下Ctrl + D时,能够退出With(退出失败84)。 getLine只会输出错误并退出程序(并返回1)

deBruijn: <stdin>: hGetLine: end of file

如何更改此行为?我只想将退出值更改为84。

2 个答案:

答案 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异常,所以这是我推荐的方法。