haskell - 在 GHC (Haskell) 中捕获 Control-C 异常

标签 haskell ghc

我在 Haskell 中构建了一个非常简单的 read-eval-print-loop 来捕获 Control-C(用户中断)。然而,每当我编译并运行这个程序时,它总是捕获第一个 Control-C,并总是在第二个 Control-C 上中止,退出代码为 130。无论我在两个之前和之间输入多少行输入,都没有关系。 Control-C,事情总是这样发生。我知道我一定错过了一些简单的东西......请帮忙,谢谢!

注意:这是基于 4 的异常,因此 Control.Exception 而不是 Control.OldException。

import Control.Exception as E
import System.IO

main :: IO ()
main = do hSetBuffering stdout NoBuffering
          hSetBuffering stdin NoBuffering
          repLoop

repLoop :: IO ()
repLoop
  = do putStr "> "
       line <- interruptible "<interrupted>" getLine
       if line == "exit"
          then putStrLn "goodbye"
          else do putStrLn $ "input was: " ++ line
                  repLoop

interruptible :: a -> IO a -> IO a
interruptible a m
  = E.handleJust f return m
  where
    f UserInterrupt
      = Just a
    f _
      = Nothing

最佳答案

韦虎是对的;当按下第二个 Control-C 时,Haskell 运行时系统会故意中止程序。为了获得人们可能期望的行为:

import Control.Exception as E
import Control.Concurrent
import System.Posix.Signals

main = do
  tid <- myThreadId
  installHandler keyboardSignal (Catch (throwTo tid UserInterrupt)) Nothing
  ... -- rest of program

关于haskell - 在 GHC (Haskell) 中捕获 Control-C 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2349233/

相关文章:

haskell - 为什么 “failing”(来自镜头)会产生无效遍历?

c++ - 如何使用haskell从c++头文件中提取函数?

parsing - 如何使用 attoparsec 解析固定长度、非分隔整数?

haskell - 将字符串视为 Haskell 程序

performance - 当它们应该是相同的东西时,为什么 >>= 比 concatMap 快?

haskell - 为什么我不能使 String 成为类型类的实例?

haskell - 测试两个异构值之间的相等性

string - 如何在haskell中组合两个字符串中的字母

java - 排序算法效率

Haskell 类型级 lambda 演算错误(或缺乏)