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

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

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

0
fluidsonic 11 Окт 2014 в 09:46