如何捕获 C 函数调用的 Haskell 回调函数中引发的 Haskell 异常?

2023-12-26

有没有什么好方法来捕获由c函数调用的haskell回调函数中引发的haskell异常?

例如,让我有一个简单的 c 函数,它只调用给定的回调,

void callmeback ( void (*callback) () ) {
  callback ();
}

以及通过 ffi 使用此函数的 haskell 代码。

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module Main (main) where

import Foreign
import Control.Exception
import Data.Typeable

foreign import ccall safe "wrapper"
        mkCallback :: IO () -> IO (FunPtr (IO ()))

foreign import ccall safe "callmeback"
        callmeback :: FunPtr (IO ()) -> IO ()

data AnError = AnError String deriving (Show, Eq, Typeable)
instance Exception AnError             

callback :: IO ()
callback = throwIO $ AnError "Catch me."

callMeBack :: IO () -> IO ()
callMeBack f = do fp <- mkCallback f
                  callmeback fp
main = do callMeBack callback `catch`
             (\ e -> do putStrLn $ show (e :: AnError)
                        putStrLn "I caught you." )
          putStrLn "-- Happy end."

执行结果(使用GHC 7.8.2编译)如下:

% ./Catch
Catch: AnError "Catch me."

所以看起来好像抛出了异常callback不能陷入main。 我怎样才能使这种代码正常工作?


您必须手动执行此操作,如下所示:

  • 将回调函数包装在调用的 Haskell 代码中try,然后序列化结果Either SomeException ()到您可以从 C 处理的格式(您可以使用StablePtr为了SomeException,但重点是你需要处理Either不知何故)。

  • 在您的 C 代码调用回调的地方,检查结果是否是Left exn如果是这样,则将错误传播到 C 代码的顶层,并在此过程中适当释放资源。此步骤是非机械的,因为 C 没有例外。

  • 在 C 代码的顶层,重新序列化异常或结果,并在 Haskell 函数中读取它,该函数包装对 C 代码的调用,引发异常或返回适当的结果。

我不知道有任何程序可以执行此操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何捕获 C 函数调用的 Haskell 回调函数中引发的 Haskell 异常? 的相关文章

  • 双共体的方法是什么?

    在思考建议哪些更有用的标准课程时到这个 https stackoverflow com a 40833245 745903 class Coordinate c where createCoordinate x gt y gt c x y
  • 如何解决声纳中的 dodgy:unchecked/unconfirmedcast 问题?

    我在下面的代码中通过声纳获得异常 我该如何解决这个问题 建议我 Override public boolean validate BaseInfo infoObject boolean isValid true AckTransferPay
  • 抛出 UnsupportedOperationException

    因此其中一种方法的描述如下 public BasicLinkedList addToFront T data 该操作无效 对于排序列表 将生成 UnsupportedOperationException 使用消息 排序列表的操作无效 我的代
  • 如何在Python的Try/Catch块中捕获所有异常?

    我正在编写 python 代码来在 linux 环境中安装我的程序所需的所有库包 因此 linux 可能包含 python 2 7 或 2 6 或两者都包含 所以我开发了一个 try and except 块代码 将在 linux 中安装
  • 模式匹配需要圆括号来表示非空列表而不是方括号

    在 Haskell 中 为什么模式匹配期望列表在不为空时有圆括号而不是方括号 当它尝试与空列表 方括号 进行模式匹配时 为什么它不遵循相同的约定 圆括号不应该专门为元组保留吗 例如 下面不起作用 third Integral a gt a
  • Windows 窗体未处理异常对话框

    每当我的 C 应用程序遇到 U E 时 我希望获得默认 Windows 窗体未处理异常对话框 在 vs 2005 中 当我关闭 app conf 中的 jit 调试时 如下所示
  • yii2:抛出新异常的正确方法

    只是为了测试 我在模型中添加了这段代码 同时设置 debug true 和 false if packagedays lt 1 throw new yii base Exception package days cannot be less
  • 关于pl/sql异常的问题

    以下文字摘录自oracle文档Oracle Database PL SQL 语言参考 11g 第 1 版 11 1 未处理的异常也会影响 子程序 如果退出子程序 成功后 PL SQL 将值分配给 输出参数 但是 如果您退出 带有未处理的异常
  • 解析 Rust FFI 中的联合结构

    我在解析 c union 结构 XEvent 时遇到问题 我正在 Rust 中试验 Xlib 和 X Record Extension 我生成 ffi 绑定Rust 绑定根 https github com crabtw rust bind
  • System.Drawing.Icon 构造函数抛出“操作成功完成”异常

    在 Windows XP 计算机上 以下代码抛出 System ComponentModel Win32Exception 并显示消息 操作成功完成 System Drawing Icon icon new System Drawing I
  • 当单态限制打开*时,如何解决歧义问题?

    因此 在学习 Haskell 时 我很快就遇到了可怕的单态限制 在 ghci 中 Prelude gt let f print show Prelude gt f 5
  • VBA 错误处理有哪些好的模式? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 VBA 中有哪些好的错误处理模式 特别是 在这种情况下我应该做什么 some code some code where an error mig
  • yesod——密码保护临时站点

    我正在尝试设置 yesod 网络服务器的临时实例 我想知道是否有一些简单的方法可以使整个站点受到密码保护 具体来说 我希望能够提示那些导航到我的网站的人提供凭据 经过身份验证后 它应该像典型站点一样运行 但如果他们无法验证自己的身份 他们就
  • 在 Haskell 中等待然后检测按键的简单方法是什么?

    我对 Haskell 还很陌生 所以我正在寻找一种简单的方法来检测按键 而不是使用getLine 如果有人知道任何库 或者知道一些这样做的技巧 那就太好了 如果有更好的地方可以问这个问题 请直接告诉我 我将不胜感激 如果您不想阻止 可以使用
  • C++ 中的错误分配异常

    在我的一个学校项目中 我被要求创建一个程序而不使用STL 在程序中我使用了很多 Pointer new Something if Pointer NULL throw AllocationError 我的问题是关于分配错误 有没有一个自动例
  • 我们不应该使用单子绑定来使用循环写下 mfix 的情况

    我一直在尝试写mfix向下使用Control Arrow loop https hackage haskell org package base 4 14 0 0 docs src Control Arrow html loop 我想出了不
  • 在新表达式中分配内存后是否评估初始化程序?

    考虑代码 auto p new T U std move v 那么初始化器就是U std move v 我们假设T U std move v 不抛出 如果在底层内存分配之后评估初始化程序 则代码是强异常安全的 否则 就不是 内存分配被抛出
  • 应用交换律

    带有效果的应用程序编程 http staff city ac uk ross papers Applicative html麦克布莱德和帕特森的论文提出了互换法 u lt gt pure x pure f gt f x lt gt u 为了
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • Haskell,范围缩小到无步骤[重复]

    这个问题在这里已经有答案了 为什么在 Haskell 中工作范围不能降低到没有步骤 7 1 gt 但只工作这个 7 6 1 gt 7 6 5 4 3 2 1 Haskell 无法知道您想要执行 1 除非您给出提示 在某些情况下 您可能需要一

随机推荐