代码之家  ›  专栏  ›  技术社区  ›  Paul Johnson

使用gi gtk和reactive banana捕获haskell异常

  •  9
  • Paul Johnson  · 技术社区  · 6 年前

    当然,我的应用程序是没有bug的,但是只是为了防止它包含任何我想放在通用异常捕捉器中的底部值,它至少会弹出一个消息框,告诉用户要报告什么类型的bug。因为我在用 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" 在“帮助关于”的处理程序中,我的程序刚退出,并向控制台打印了一条消息(当然,我的用户不会看到)。

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Yuras    6 年前

    有类似的问题 here (尽管它不是特定于 gi-gtk ,更一般一点)T。我也建议 this 邮政。

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

    就你而言, Gtk.main gtk 事件循环在C中实现,回调在Haskell中实现。当回调抛出haskell异常时,它必须通过 GTK 事件循环以达到 executeProgram 功能。但由于上述原因,这是不可能的。

    恐怕,解决方案是捕获每个回调中的所有异常。在您的情况下,您可能可以在 on 函数来自 GI GTK 将捕获所有异常并显示Bug对话框。