2016-11-08 2 views
1

В нашем приложении у нас есть статическая библиотека C++, и я использую Objective-C++ для работы с ней. что C++ библиотека использует rapidjson для синтаксического анализа XML-данных:C++ try/catch ignorance in iOS

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; 
     } 

Проблема заключается в том, что если документ [ «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's Swift.

+0

Что произойдет, если вы измените его на 'catch (const std :: exception & e)'? Также вы уверены, что 'GetInt()' возвращает что-то, полученное из 'std :: exception'? – NathanOliver

+0

@NathanOliver, это было первое, что я пытался сделать, не помогло. Я вообще не разбираюсь в C++, просто задаюсь вопросом то же самое: как возможно, что в такой ситуации (когда GetInt() не может преобразовать ввод-текст в Integer), исключение не будет повышаться. И как это зависит от компиляторов/ОС (как и в ОС Android, исключение составляло повышение, а блок catch принимал меры) – autobot

ответ

2

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

+0

Похоже на решение. Проблема заключается в том, что каким-то образом они не отключены в режиме деблокирования (который установлен в настройках схемы -> Archive-> Buid config). В любом случае, я попытаюсь отключить их внутри quickjson, tnx! – autobot