В качестве заголовка выбросить исключение в 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?

0
mattjo 11 Окт 2014 в 09:33

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 для своих нужд.

0
mattjo 21 Окт 2014 в 15:18

Большинство библиотек Objective-C (особенно UIKit) не поддерживают исключения, и Apple настоятельно не рекомендует их использование. Перехват исключений в коде Objective-C может привести к различным ошибкам.

Если вы хотите использовать код C ++ в своем классе Objective-C, вы должны использовать Objective-C ++, назвав файл .mm вместо .m.

0
fluidsonic 11 Окт 2014 в 13:46
.mm и .m with compile as ObjC-C++ подходят. Но если исключение конструкции C++, такое как std::bad_alloc(), не может быть обработано, что-то вроде RAII скучно и уродливо, или я должен установить какую-то границу между этими языками.
 – 
mattjo
12 Окт 2014 в 09:15