С++ попробовать/поймать невежество в iOS

В нашем приложении у нас есть статическая библиотека C++, и я использую Objective-C++ для работы с ней. Эта библиотека С++ использует Rapidjson для анализа XML-данных:

try {
            rapidjson::Document document;
            document.Parse(connection.data.description);
            connection.openTime = document["openFrom"].GetInt();
            connection.closeTime = document["openTo"].GetInt();
            return true;
        } catch (std::exception e) {
            connection.openTime = 0;
            connection.closeTime = 0;
            return false;
        }

Проблема в том, что если document["openFrom"] не может быть преобразован в Int с помощью метода GetInt(), исключение не возникает. Вместо этого мое приложение вылетает из-за SIGABRT.

Assertion failed: (data_.f.flags & kIntFlag), function GetInt, file /Users/xxx/xxx/xx/ios/../src/rapidjson/document.h, line 1645.

В ОС Android, кстати, в том же случае исключение вызывается успешно. В чем может быть проблема? Я предполагаю, что проблема заключается в поведении компилятора Xcode Swift.


person autobot    schedule 08.11.2016    source источник
comment
Что произойдет, если вы измените его на catch (const std::exception& e)? Также вы уверены, что GetInt() возвращает что-то производное от std::exception?   -  person NathanOliver    schedule 08.11.2016
comment
@NathanOliver, это было первое, что я попытался сделать, не помогло. Я совсем не силен в С++, просто задавался вопросом: как возможно, что в такой ситуации (когда GetInt() не может преобразовать ввод-текст в Integer) исключение не будет возбуждено. И как это зависит от компиляторов/ОС (как и в ОС Android, было поднято исключение, и блок catch сработал)   -  person autobot    schedule 08.11.2016


Ответы (1)


Как ясно указано в предоставленном вами журнале, это не сбой, это просто неудачное утверждение, которое внутренне вызывает abort(), что приводит к SIGABRT, что означает «отмена сигнала». Утверждения отключены в режиме выпуска, поэтому там все должно работать нормально. Или вы можете отключить утверждения в Rapidjson (определив макрос RAPIDJSON_ASSERT).

person Teivaz    schedule 08.11.2016
comment
Похоже на решение. Проблема в том, что почему-то они не отключаются в деблокированном режиме (который устанавливается в настройках схемы->Архив->Buid config). В любом случае, я попытаюсь отключить их внутри Rapidjson, спасибо! - person autobot; 08.11.2016