我在 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/