【问题标题】:Change exit value on getLine exception in Haskell在 Haskell 中更改 getLine 异常的退出值
【发布时间】:2019-03-10 18:50:56
【问题描述】:

我在 Haskell 从事一个学生项目,但我遇到了 getLine 的行为问题。 这是代码(简化):

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

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

deBruijn: <stdin>: hGetLine: end of file

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

【问题讨论】:

标签: haskell


【解决方案1】:

您的程序永远不会看到 Control-D。它所做 看到的是标准输入已关闭,在本例中是由您的终端 响应输入的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

【讨论】:

  • 小修正:import System.IO 需要 isEOF
【解决方案2】:

您可以在发生 IO 异常时捕获它,而不是手动检查 isEof

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

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2018-03-29
    相关资源
    最近更新 更多