首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gi-gtk和反应式Banana捕获Haskell异常

使用gi-gtk和反应式Banana捕获Haskell异常
EN

Stack Overflow用户
提问于 2018-05-23 21:56:28
回答 1查看 167关注 0票数 9

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

代码语言:javascript
复制
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信号时,如何捕获代码内部发生的异常?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-28 19:55:15

有类似的问题here (虽然它不是特定于gi-gtk的,所以是一个更一般的问题)t。我也推荐this帖子。

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50490280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档