6

これが jsoncpp に固有のものなのか、C++ ライブラリの動作を改善する一般的なパラダイムなのかはわかりません。基本的に、私はこのトレースを取得しています:

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();
4

2 に答える 2

4

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

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

名前でオブジェクト値にアクセスし、存在しない場合は null メンバーを作成します。

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

于 2012-06-01T15:17:10.720 に答える
4

JsonCpp Sourceforge リポジトリからわかるように、現在、アサーションはキャッチできません (ただし、アサーションをスローするバックログにあるようです)。

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

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

于 2012-06-01T15:24:44.130 に答える