Haskell 从线程强制退出程序
我使用Haskell 从线程强制退出程序,haskell,Haskell,我使用error函数来传达一个巨大的程序员错误(有点像c断言),我希望程序立即失败并迫使我修复一个明显的错误(与标准运行时异常相反)。这已经很好地工作了很多年,但我目前正在开发一个多线程程序,现在它让我失望了 在线程中调用error不会退出程序。这是有据可查的。对于系统.Exit.die,控制.Exception.Base.assert等也存在此问题 我见过一些例子,它们通过在子线程和主线程之间构建重量级通信方法来绕过这个程序,但出于许多原因,这对于我来说很少实用: 我的线程通常是由库创建的,比
error
函数来传达一个巨大的程序员错误(有点像c断言),我希望程序立即失败并迫使我修复一个明显的错误(与标准运行时异常相反)。这已经很好地工作了很多年,但我目前正在开发一个多线程程序,现在它让我失望了
在线程中调用error
不会退出程序。这是有据可查的。对于系统.Exit.die
,控制.Exception.Base.assert
等也存在此问题
我见过一些例子,它们通过在子线程和主线程之间构建重量级通信方法来绕过这个程序,但出于许多原因,这对于我来说很少实用:
错误
通常在库调用中抛出,例如在调用head[]
时有没有办法强迫整个程序故意从一个线程崩溃?下面的示例适用于我在Windows上的应用;我导入并调用外部C函数
退出
:
{-# 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..."
如果您自己在执行
fork
ing,您可以捕获ErrorCall
异常并将其重新发送到主线程。从文档中可以看出:“在一个独立的GHC程序中,只有主线程需要终止才能终止进程。”如果fork
ing是由一些库函数(如mergeSources
)完成的,那么情况就更复杂了——您无法控制在哪个线程中引发ErrorCall
。你有一个示例程序吗?我相信在导管的情况下,您可以编写一个函数来封装异常处理程序中生成的每个值。