我在Haskell中爲Scheme解釋器實現REPL,我想處理一些像UserInterrupt,StackOverflow,HeapOverflow等異步事件...基本上,我想停止電流運算時發生UserInterrupt和時的StackOverflow和HeapOverflow發生打印合適的消息等我實現這個如下:在Haskell中處理UserInterrupt異常
repl evaluator = forever $ (do
putStr ">>> " >> hFlush stdout
out <- getLine >>= evaluator
if null out
then return()
else putStrLn out)
`catch`
onUserInterrupt
onUserInterrupt UserInterrupt = putStrLn "\nUserInterruption"
onUserInterrupt e = throw e
main = do
interpreter <- getMyLispInterpreter
handle onAbort (repl $ interpreter "stdin")
putStrLn "Exiting..."
onAbort e = do
let x = show (e :: SomeException)
putStrLn $ "\nAborted: " ++ x
它可以作爲一個例外預期。如果我開始解釋,然後按Ctrl-Z + Enter鍵,我得到:
>>> ^Z
Aborted: <stdin>: hGetLine: end of file
Exiting...
這是正確的。但是,如果我開始解釋,然後按Ctrl-C,然後按Ctrl-Z + Enter鍵,我得到:
>>>
UserInterruption
>>> ^Z
它掛,我不能再使用的解釋。但是,如果我再次按下Ctrl-C,則REPL將取消阻止。我搜查了很多,我無法弄清楚它的原因。任何人都可以解釋我?
非常感謝!
中所述我從來沒有看到Ctrl-Z被抓住了。第一個Ctrl-C被捕獲,但第二個不是。這可能是同樣的問題。 你可以在一個完整的工作測試用例中更改你的代碼嗎? F.E. 'return'而不是'interpreter'stdin''並添加了正確的導入。 –