我使用error
函数来传达一个巨大的程序员错误(有点像ac断言),我希望程序立即失败并迫使我修复一个明显的错误(与标准的运行时异常相反) 。这项工作多年来一直运作良好,但我目前正在开发一个多线程程序,它现在让我失望了。
在线程中调用error
不会退出程序。这是有据可查的,https://hackage.haskell.org/package/base-4.8.2.0/docs/Control-Concurrent.html。 System.Exit.die
,Control.Exception.Base.assert
等
我已经看到通过在子线程和主线程之间构建重量级通信方法来绕过这个程序的例子,但由于很多原因,这对我的目的来说很少实用:
error
经常被引入库调用,就像您致电head []
时一样。有没有办法强制整个程序故意从一个线程崩溃?
答案 0 :(得分:2)
以下示例适用于Windows;我导入并调用外部C函数exit
:
{-# LANGUAGE ForeignFunctionInterface #-}
module Main where
import Control.Concurrent
foreign import ccall "exit" exit :: IO ()
main = do
forkIO exit
threadDelay 1000000
putStrLn "Main is still running..."