2016-11-08 5 views
1

私たちのアプリでは、C++静的ライブラリがあり、Objective-C++を使用しています。i ++でC++ 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に変換することができない場合は、例外が発生していないことである:++ライブラリは、XMLデータを解析するrapidjsonを利用しcは 。代わりに私のアプリはSIGABRTでクラッシュします。

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

Android OSでは、btwも同じように例外が発生します。 何が問題なのでしょうか? XcodeのSwiftコンパイラの動作に問題があると思います。それは明らかにあなたが提供するログで述べたように

+0

これを 'catch(const std :: exception&e)'に変更するとどうなりますか? 'GetInt()'は 'std :: exception'から派生したものを返しますか? – NathanOliver

+0

@ NathanOliver私がやろうとした最初のことは助けになりませんでした。私はC++がうまくいかず、同じことを考えました。そのような状況(GetInt()が入力テキストをIntegerに変換できない場合)では、例外は発生しません。コンパイラ/ OSに依存する方法(Android OSの場合と同様、例外が発生しキャッチブロックが発生した) – autobot

答えて

2

- それは内部的に「信号のアボート」の略でSIGABRTになりabort()を呼び出すだけ失敗したアサートされ、クラッシュではありません。アサーションはリリースモードでは無効になっているので、そこで正常に動作するはずです。または、rapidjsonでアサートを無効にすることができます(マクロRAPIDJSON_ASSERTを定義して)。

+0

解決策のように見えます。何らかの形でリリースモードで無効になっていないという問題があります(これはScheme settings-> Archive-> Buid configで設定されています)。とにかく私はrapidjson、tnxの中でそれらを無効にしようとします! – autobot