2012-06-01 133 views
6

これがjsoncppやC++ライブラリをより良く動作させる方法に関する一般的なパラダイムであるかどうかはわかりません。基本的に私はこのトレースを得ています:C++ライブラリでの優雅なエラー処理 - jsoncpp

imagegeneratormanager.tsk: src/lib_json/json_value.cpp:1176: const Json::Value&  Json::Value::operator[](const char*) const: Assertion `type_ == nullValue || type_ == objectValue' failed. 

入力が悪いときに起こります。 memcached経由で別のアプリケーションから来ている入力が悪くなったとき、私はこのエラーを処理したいと思います。あなたは優雅に知っています。おそらく、「エラー:アイテム15006の入力が悪い」のようなものがログに記録されます。私のJSON文字列処理タスク全体がクラッシュすることはありません。

これはひどく書かれたライブラリですか、それとももっと微妙に構成することは可能ですか?

編集:ここにいくつかの呼び出し元のコードがあります:

Json::Value root; 
Json::Reader reader; 
succeeded = reader.parse(jsonString, root); 

if(!succeeded) { 
    throw std::runtime_error(std::string("Failed to parse JSON for key ") + emailInfoKey.str()); 
} 

std::string userEmail = root.get("userId", "").asString(); 
std::string bodyFilePath = root.get("bodyFilePath", "").asString(); 
std::string msgId = root.get("msgId", "").asString(); 
+0

要素のタイプをチェックできないと言っていますか? –

+0

おそらく?コールスタックやカスタムエラーメッセージなどを与えるアサーションと違うので、このエラーがパーズラインかアクセスラインかどうかわかりません。 – djechlin

+0

あなたは、値に 'operator []'を呼び出しています。例えば、intや文字列です。 –

答えて

4

ライブラリリファレンスによると:

Value & Json::Value::operator[] (const StaticString & key)

Access an object value by name, create a null member if it does not exist.

あなたは非オブジェクトにoperator[]を呼び出そうとしているようだ、整数または文字列を言いますgetは内部でoperator[]を使用します)。関数の前提条件を破っています。ライブラリのコードではなく、コード側のエラーです。 isObject()を使用してアクセスする前に、Json::Valueがオブジェクトであるかどうかを確認できます。

4

私はJsonCpp Sourceforgeリポジトリから見ると、アサーションはキャッチ可能ではありません(ただし、アサーションをスローするためにバックログにあるようです)。

次に、[]演算子を呼び出す前に入力が有効かどうかをテストする必要があります。

最新のリビジョンのソースコードへのリンクです(あなたのバージョンはわかりません)。 1141行目を参照してください: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup

+2

代わりにアサーションを今のところ例外にすることができます:https://github.com/open-source-parsers/jsoncpp/pull/174 – cdunn2001

関連する問題