【发布时间】:2016-03-11 04:37:08
【问题描述】:
我使用error 函数来传达一个严重的程序员错误(有点像 c 断言),我希望程序立即失败并强制我修复一个明显的错误(与标准运行时异常相反)。这多年来一直运作良好,但我目前正在开发一个多线程程序,现在它让我失望了。
在线程中调用error 不会退出程序。这是有据可查的,https://hackage.haskell.org/package/base-4.8.2.0/docs/Control-Concurrent.html。 System.Exit.die、Control.Exception.Base.assert等也存在这个问题。
我已经看到通过在子线程和主线程之间构建重量级通信方法来绕过该程序的示例,但这对于我的目的来说很少实用,原因有很多:
- 我的线程通常由库创建,例如管道 mergeSources。
-
error经常在库调用中抛出,例如当您调用head []时。 - 如果我需要通过线程间通信进行路由,那么很容易错过该机制。
有没有办法强制整个程序故意从一个线程崩溃?
【问题讨论】:
-
如果你自己在做
forking,你可以捕获ErrorCall异常并将其重新抛出到主线程。来自文档:“在独立的 GHC 程序中,只需要终止主线程才能终止进程。”如果forking 是由诸如mergeSources之类的库函数完成的,情况就更复杂了——您对ErrorCall在哪个线程中引发的控制较少。您有示例程序吗?我相信在管道的情况下,您可以编写一个函数来包装异常处理程序中产生的每个值。
标签: haskell