C++或64位Objective C的异常是否能够安全地传递到Swift代码中?

3

我知道C++异常和Swift异常(本质上是NSError **的语法糖)是完全不同的。

我的问题是,当Objective-C++代码调用一个Swift回调函数,该回调再调用Objective-C++代码并抛出异常时,原始调用者能否期望安全/合理的行为,并捕获该异常。这是否有文档记录?

在我的情况下,Swift部分的编写者将意识到这种情况,请避免从架构角度建议避免这种情况。我的问题更像是,Swift对象是否会被ARC-(自动)释放,并且是否会进行任何其他必要的运行时清理。


CodaFi:这也是我的直觉,但这是否有记录?请注意,仍然可以使用c++ abi(和/或c++)编写不安全的异常代码,并且Swift标准库是代码。 - Zsolt Szatmari
@CodaFi目前是错误的。Swift C++互操作宣言的异常部分将在被Swift调用的C++代码中实现C++异常的互操作性作为一个值得称赞的目标,但目前还未达成。https://github.com/apple/swift/blob/main/docs/CppInteroperabilityManifesto.md#exceptions - Andreas ZUERCHER
是的,我不知道当时怎么想的,但那个旧评论是非常错误的。不要通过Swift框架抛出C++异常。Swift不知道如何为C++发出正确的异常传播或清理代码,并且Swift异常(与ObjC异常不同)根本不与C++ ABI兼容 - 它们是完全不同的概念。来自C++的任何异常都需要是致命的,或者在C++中处理。 - CodaFi
1个回答

1

1
此外,ObjC 异常不应该通过 Swift 框架传播。这是可怕的未定义行为。确保您将可能引发异常的任何内容包装在跨语言边界时,将错误作为 NSError 返回给 Swift,或者终止进程。 - CodaFi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接