【问题标题】:c++ exception(std::bad_alloc) handle in objc++objc++ 中的 c++ 异常(std::bad_alloc)句柄
【发布时间】:2014-12-06 08:02:21
【问题描述】:

作为标题,在c++中抛出异常:

class TestCpp
{
public:
    TestCpp (){
        NSLog(@"TestCpp init.");
        throw "simple exception."; // or throw std::bad_alloc();
    }
    ~TestCpp(){
        NSLog(@"TestCpp fini.");
    }
};

然后像这样捕捉它:

@try{
    TestCpp o;
}
@catch(NSException* ex) {
    NSLog(@"exception: %@", ex.reason);
}
@catch(...){
    NSLog(@"unknown exception.");
}

但这行不通。 而且,在objc++中,如果没有办法处理C++抛出的异常,我们如何处理C++实例构造异常,比如std::bad_alloc?

【问题讨论】:

    标签: c++ objective-c exception


    【解决方案1】:

    大多数 Objective-C 库(尤其是 UIKit)不支持异常,Apple 强烈反对使用它们。在 Objective-C 代码中捕获异常会导致各种错误。

    如果你想在你的 Objective-C 类中使用 C++ 代码,那么你必须通过将文件命名为 .mm 而不是 .m 来使用 Objective-C++

    【讨论】:

    • .mm.m with compile as ObjC-C++ 都可以。但是如果无法处理诸如 std::bad_alloc() 之类的 C++ 构造异常,则诸如 RAII 之类的东西既无聊又丑陋,或者我必须设置一些跨这些语言的边界。跨度>
    【解决方案2】:

    长时间调查一下,我得到了一些代码:

    Type* obj_ptr = new (std::nothrow) Type;
    if(obj_ptr==nullptr) {
        @throw NSMallocException;
    }
    ......
    

    所以一切正常。因为 NSMallocException 已经被初始化为进程启动。 其他一些资源获取失败可以如下处理:

    Resource* resource_handle = acquire(Resource);
    if(resource_handle==nullptr) {
        @throw NSXxxGenericException;
    }
    ......
    

    或者您可以根据您的自定义需要初始化一些特殊的 NSXxxException。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 2020-04-09
      • 2012-02-13
      • 1970-01-01
      • 2021-08-18
      • 2013-12-20
      • 2019-06-22
      • 2011-08-14
      相关资源
      最近更新 更多