2016-11-08 14 views
1

在我们的应用程序中,我们有一个C++静态库,我使用Objective-C++来处理它。 即C++库利用rapidjson解析XML数据:iOS中的try/catch无知

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”]不能通过GetInt转化为INT()方法,例外不引发。而不是我的应用程序与SIGABRT崩溃。

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

在Android OS上,顺便说一句,在同样的情况下,异常成功提升。 可能是什么问题?我想这个问题是在Xcode的Swift编译器行为。

+0

如果将其更改为catch(const std :: exception&e)'会发生什么?你也确定'GetInt()'返回从std :: exception'派生的东西吗? – NathanOliver

+0

@NathanOliver这是我尝试做的第一件事,没有帮助。我不擅长C++,只是想知道同样的事情:在这种情况下(当GetInt()不能将输入文本转换为整数)时,怎么可能不会引发异常。以及它如何依赖编译器/操作系统(如在Android OS上,例外情况是raise和catch block采取行动) – autobot

回答

2

正如您所提供的日志中明确表示 - 这是不是一个崩溃,它仅仅是一个失败的断言其内部调用abort()导致SIGABRT它表示“信号中止”。断言在释放模式下被禁用,所以它应该在那里正常工作。或者你可以禁用rapidjson中的断言(通过定义宏RAPIDJSON_ASSERT)。

+0

看起来像一个解决方案。问题在于它们在发布模式下不被禁用(在Scheme设置 - >存档 - > Buid配置中设置)。无论如何,我会尽力禁用它们在rapidjson,tnx里面! – autobot