9

当然,我的应用程序没有错误,但以防万一它包含我想放入通用异常捕获器中的任何底部值,它至少会弹出一个消息框告诉用户要报告哪种错误。因为我使用的是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

我也在使用Reactive Banana以防万一,但这在 FRP 代码之外。

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

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

4

1 回答 1

3

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

基本上,haskell 异常不能通过 haskell/C 边界。仅仅是因为 C 对 haskell 异常一无所知。

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

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

于 2018-05-28T11:55:15.293 回答