В качестве заголовка выбросить исключение в 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?
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 для своих нужд.
Большинство библиотек Objective-C (особенно UIKit) не поддерживают исключения, и Apple настоятельно не рекомендует их использование. Перехват исключений в коде Objective-C может привести к различным ошибкам.
Если вы хотите использовать код C ++ в своем классе Objective-C, вы должны использовать Objective-C ++, назвав файл .mm
вместо .m
.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
.mm
и.m with compile as ObjC-C++
подходят. Но если исключение конструкции C++, такое как std::bad_alloc(), не может быть обработано, что-то вроде RAII скучно и уродливо, или я должен установить какую-то границу между этими языками.