当然,我的应用程序是没有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"放在"Help About“的处理程序中,然后我的程序就退出了,并向控制台打印了一条消息(当然,我的用户看不到它)。
当代码响应GTK信号时,如何捕获代码内部发生的异常?
发布于 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函数上编写一个包装器,它将捕获所有异常并显示错误对话框。
https://stackoverflow.com/questions/50490280
复制相似问题