2016-03-10 62 views
4

我使用error函數來傳遞一個巨大的程序員錯誤(有點像ac assert),我希望程序立即失敗並迫使我修復一個明顯的錯誤(與標準相對運行時異常)。這種方式多年來一直運行良好,但我目前正在開發一個多線程程序,現在它正在讓我失望。在線程中調用error不會退出程序。這是有據可查的,https://hackage.haskell.org/package/base-4.8.2.0/docs/Control-Concurrent.html。這個問題也存在於System.Exit.dieControl.Exception.Base.assert從線程強行退出程序

我已經看到了通過建立子線程和主之間的一個重量級的通信方法,這一計劃得到周圍的例子,但是這是我的目的不實際,對很多原因:

  1. 我的線程往往是由庫創建的,比如conduits mergeSources。
  2. error往往會引發圖書館電話,就像您撥打head []時一樣。
  3. 如果我需要通過線程間通信進行路由,它會使它很容易錯過這個機制。

有沒有辦法強制整個程序故意從線程崩潰?

+0

如果你正在做的'fork'ing自己,你可以趕上'ErrorCall'例外,它重新拋出主線程。從文檔中:「在獨立的GHC程序中,只有主線程需要終止以便進程終止。」如果fork是通過像mergeSources這樣的庫函數完成的,那麼情況會更復雜 - 您無法控制'ErrorCall'引發哪個線程。您是否有示例程序?我相信管道的情況下,你可以編寫一個函數來封裝異常處理程序中生成的每個值。 – user2407038

回答

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..."