使用 gi-gtk 和 Reactive Banana 捕捉 Haskell 异常
Catching Haskell exceptions with gi-gtk and Reactive Banana
当然,我的应用程序没有错误,但以防万一它包含任何底值我想放入一个通用异常捕获器,它至少会弹出一个消息框来告诉用户什么样的错误报告。因为我正在使用 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 信号作出反应时,如何捕获代码中发生的异常?
有类似问题 (though it is not specific to gi-gtk
, so is a bit more general)t. Also I'd recommend thispost.
基本上,haskell 异常不能通过 haskell/C 边界。仅仅是因为 C 对 haskell 异常一无所知。
在你的例子中,Gtk.main
运行 gtk
事件循环,它是用 C 实现的,回调是在 haskell 中实现的。当回调抛出 haskell 异常时,它必须经过 gtk
事件循环才能到达 executeProgram
函数。但由于上述原因,这是不可能的。
恐怕,解决方案是在每个回调中捕获所有异常。在您的情况下,您可能可以在 gi-gtk
的 on
函数上编写一个包装器,它将捕获所有异常并显示错误对话框。
当然,我的应用程序没有错误,但以防万一它包含任何底值我想放入一个通用异常捕获器,它至少会弹出一个消息框来告诉用户什么样的错误报告。因为我正在使用 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 信号作出反应时,如何捕获代码中发生的异常?
有类似问题gi-gtk
, so is a bit more general)t. Also I'd recommend thispost.
基本上,haskell 异常不能通过 haskell/C 边界。仅仅是因为 C 对 haskell 异常一无所知。
在你的例子中,Gtk.main
运行 gtk
事件循环,它是用 C 实现的,回调是在 haskell 中实现的。当回调抛出 haskell 异常时,它必须经过 gtk
事件循环才能到达 executeProgram
函数。但由于上述原因,这是不可能的。
恐怕,解决方案是在每个回调中捕获所有异常。在您的情况下,您可能可以在 gi-gtk
的 on
函数上编写一个包装器,它将捕获所有异常并显示错误对话框。