使用gi-gtk和Reactive Banana捕获Haskell异常

Pau*_*son 9 haskell frp gtk3

当然,我的应用程序没有错误,但是如果它包含任何底部值,我想放入一个通用异常捕获器,它至少会弹出一个消息框告诉用户要报告什么类型的错误.因为我正在使用gi-gtk,我认为初始化后的任何异常都会从Gtk.main函数内部发生,所以我的main函数的结尾看起来像这样:

let executeProgram =
     catch Gtk.main $ \e -> do
           reportThisBugDialog $ show (e :: SomeException)
           -- Code here to try to recover to a known good state
           executeProgram
executeProgram
Run Code Online (Sandbox Code Playgroud)

我也使用Reactive Banana以防相关,但这不在FRP代码中.

但是,这不会捕获任何异常.我输入error "Test Exception"了"Help About"的处理程序,我的程序刚退出并在控制台上打印了一条消息(我的用户当然不会看到).

当我对代码响应GTK信号时,如何捕获代码中发生的异常?

Yur*_*ras 3

这里有类似的问题(尽管它不是特定于 的gi-gtk,所以有点更笼统)。我也推荐这篇文章。

基本上,haskell 异常无法通过 haskell/C 边界。很简单,因为 C 对 Haskell 异常一无所知。

在你的例子中,Gtk.main运行gtk事件循环,它是在 C 中实现的,回调是在 haskell 中实现的。当回调抛出 haskell 异常时,它必须经过gtk事件循环才能到达executeProgram函数。但由于上述原因,这是不可能的。

恐怕解决方案是捕获每个回调中的所有异常。在您的情况下,您可能可以编写一个on函数的包装器 from gi-gtk,它将捕获所有异常并显示错误对话框。