【问题标题】:Catch exceptions for C++ function I called in Objective-C?捕获我在 Objective-C 中调用的 C++ 函数的异常?
【发布时间】:2013-12-02 13:23:49
【问题描述】:

我的 iPad 应用程序使用 Objective-C 作为 UI,它调用了一些 C++ 函数进行计算。由于 C++ 代码写得不好,单独测试时有时会抛出异常或导致分段错误。但是,C++ 代码目前正在由其他人开发,所以我不想更改它。是否可以在我的 Objective-C 代码中捕获异常和分段错误,以便我不需要更改 C++ 代码?我尝试了基本的 try-catch,但它似乎不起作用。 (包装器是有缺陷的 c++ 函数)

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

当我运行我的应用程序并单击调用 C++ 函数的按钮时,模拟崩溃并显示错误消息libc++abi.dylib: terminating with uncaught exception of type NSException

【问题讨论】:

  • 我认为这行不通,但你能用 Objective-C++ 编写代码并以 C++ 的方式捕获异常吗?
  • 为什么不用c++ try/catch 写一个包装器并调用它呢?
  • 您的 C++ 代码不会抛出 NSException 实例。如果您想忽略所有异常,请改用catch (...)

标签: c++ ios objective-c exception-handling


【解决方案1】:

您可以将 C++ try-catch 与 Objective-C++ 代码(.mm 扩展名)一起使用

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

在 64 位进程中,您可以使用 @catch(...) 捕获包括 C++ 异常在内的所有内容

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

【讨论】:

    【解决方案2】:

    只要在 throw 和 catch 之间的堆栈跟踪中的所有代码都是在启用异常的情况下编译的,您编写的代码就应该捕获 C++ 代码抛出的 NSExceptions。检查你的编译器标志。

    您无法使用异常处理程序捕获分段错误。使用信号处理程序捕获它们并非不可能,但通常不可能做任何有用的事情来恢复,因此我们不建议这样做。

    【讨论】:

      【解决方案3】:

      我不确定这是否是您正在寻找的,但也许这也有帮助。

      如果您使用Xcode 调试您的应用程序,您可以添加异常断点。

      转到Breakpoint Navigator,找到底部的小"+"标志,点击并选择Add Exception Breakpoint。从现在开始,当您的应用程序引发异常时,Xcode 会向您显示引发异常的行。默认情况下Breakpoint Exception 适用于Objective-CC++ 异常,您可以通过右键单击Breakpoint Navigator 中的异常来更改它。

      【讨论】:

        【解决方案4】:

        您可以在文件中编写 cpp 代码(扩展名为 .mm 而不是 .m)并使用 C++ try/catch,如下所示:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-09
          • 1970-01-01
          • 2015-09-20
          • 2011-04-26
          • 1970-01-01
          • 2013-10-03
          • 1970-01-01
          相关资源
          最近更新 更多