8

我有一个用于网络通信的 C++ 库,我需要为 Mac 移植该库,以前这个库用于 Windows C++ 应用程序。

C++ Network Lib 的流程是基于发生错误时的异常,而不是返回错误代码或最后一个错误。

现在因为在 Mac 上我们使用 Objective-C/C++ 来开发应用程序。我需要在 Objective-C/C++ 中有 UI,但用于核心网络功能的库是相同的 C++ 库。

所以我的问题是目标 C 是否能够处理 C++ 调用引发的异常?如果是这样,如何?如果不是,我该如何解决?或者我们是否围绕 C++ Lib 调用编写一个包装器并使用异常并返回错误代码?

求指教,怎么解决。。

4

1 回答 1

7

如果您在 OS X 上使用 iOS 或 64 位运行时,那么一切都可以正常工作。您可以编写 C++ 风格的 try/catch,它会按预期工作,@try/@catch 也一样。请注意,对于 Objective-C 和 C++ 异常,您仍然有两种不同的样式;唯一的统一是a or捕获所有异常的特殊情况,Objective-C 或 C++。这对于集中您的清理代码有点用处,但是您可以对异常本身做的所有事情就是再次盲目地@throw。catch(...)@catch(...)

但是在任何情况下,异常都不应该用于 Objective-C(或 Objective-C++)程序中的流控制。您确实应该努力在 C++ 异常退出相关库时捕获它们,并将它们转换为更合适的机制,例如 NSError。特别是,避免让它们中的任何一个通过任何 Apple 或 3rd 方框架引发——大多数这样的框架对于 Objective-C 异常都不是异常安全的,更不用说 C++ 异常了,因此后果是不确定的(主要是围绕内存泄漏,尽管很多其他故障是可能的)。

于 2012-12-17T16:26:34.580 回答