在Objective-C中调用C++函数时如何捕获异常?

8

我的iPad应用使用Objective-C来实现UI,它调用一些C++函数进行计算。由于C++代码编写不够完善,当单独测试时,有时会抛出异常或导致段错误。但是,该C++代码目前正在由其他人开发,因此我不想更改它。是否可能在我的Objective-C代码中捕获异常和段错误,以便我不需要更改C++代码?我尝试了基本的try-catch,但似乎没有起作用(wrapper是有问题的C++函数)。

@try {
    wrapper([imageName UTF8String]);
}
@catch (NSException *e) {
    NSLog(@"Error");
}

当我运行我的应用并点击调用C++函数的按钮时,模拟器崩溃,并弹出错误信息:libc++abi.dylib: terminating with uncaught exception of type NSException

1
我不认为这会起作用,但你能否用Objective-C++编写你的代码,并以C++的方式捕获异常? - mpontillo
为什么不用C++的try/catch编写一个包装器并调用它呢? - Zhongzhi
你的C++代码不会抛出NSException实例。如果你想忽略所有异常,请使用catch (...) - Darren
4个回答

9

您可以在Objective-C++代码(.mm扩展名)中使用C++的try-catch语句。

try {
    wrapper([imageName UTF8String]);
}
catch (...) {
    NSLog(@"Error");
}

在64位进程中,您可以使用@catch(...)来捕获包括C++异常在内的所有异常。
@try {
    wrapper([imageName UTF8String]);
}
@catch (...) {
    NSLog(@"Error");
}

1
你可以在文件中编写cpp代码(使用.mm扩展名而不是.m),并像这样使用C++的try/catch:

您可以在文件(.mm扩展名而非.m)中编写cpp代码,并使用类似于以下方式的C ++ try / catch:

#include <stdexcept>

try
{
    wrapper([imageName UTF8String]);
}
catch (const std::exception & e)
{
    NSLog(@"Error");
}

1
我不确定这是否是您要找的,但也许这也有所帮助。
如果您使用Xcode调试应用程序,可以添加异常断点。
转到“断点导航器”,找到底部的小“+”符号,单击并选择“添加异常断点”。从现在开始,当您的应用程序抛出异常时,Xcode会显示抛出异常的行。默认情况下,“断点异常”适用于Objective-C和C++异常,您可以通过在“断点导航器”中右键单击异常来更改。

1
你的代码应该能够捕获由C++代码抛出的NSExceptions,只要在throw和catch之间的堆栈跟踪中的所有代码都启用了异常。检查你的编译器标志。
你无法使用异常处理程序来捕获分段错误。虽然使用信号处理程序可以捕获它们,但通常无法执行任何有用的恢复操作,因此我们不建议这样做。

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