当 CGO 在 GO 语言进程中调用 C++ 动态 SO 库时,如何获取尝试和捕获异常?

How to get try and catch exceptions when CGO calls the C++ Dynamic SO Library in GO Language Process?

提问人:rock ju 提问时间:11/17/2023 最后编辑:kostixrock ju 更新时间:11/17/2023 访问量:36

问:

我编写了一个 Go 程序,在这个程序中,我用来调用用 C++ 编写的动态库 ('.so) 来处理通信协议。该 C++ 库中的代码可能会引发异常,因此我在调用库的 C++ 函数时使用 try-catch 来捕获库代码中的异常,并使用 defer 来捕获这些异常。cgo

但事实证明,当 c++ 尝试捕获异常时,Go 代码无法捕获异常。

我的问题是如何在 Go 代码中捕获C++异常,该异常通过 调用抛C++函数。cgo

尝试-catch cgo

评论


答:

1赞 kostix 11/17/2023 #1

没有办法直接这样做。

创建一个 C/C++ 包装器(您可以在 Go 源代码中与 Go 相关的“注释”中“内联”编写它),它将调用目标 C++ 函数,但会将调用包装在 / 块中,捕获所有内容 () 并将任何捕获的异常转换为从调用返回的特殊值。cgotrycatchstd::exception

通过示例找到了如何做到这一点的一个很好的解释

评论

0赞 rock ju 11/18/2023
它有效,tks。我找到了为什么我无法捕获异常,因为我使用的演示除以零会产生异常,但是 c++ 无法捕获这种异常,因此进程死机。