2012-06-01 14 views
6

Ich bin mir nicht sicher, ob dies eine bestimmte Sache mit Jsoncpp oder ein allgemeines Paradigma mit, wie man eine C++ - Bibliothek besser verhalten wird. Grundsätzlich bekomme ich diese Spur:Anmutige Fehlerbehandlung in C++ - Bibliothek - 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. 

Das passiert, wenn der Eingang schlecht ist. Wenn die Eingabe - die von einer anderen Anwendung von mir über memcached kommt - schlecht ist, möchte ich diesen Fehler behandeln. Sie wissen, anmutig. Vielleicht etwas wie "Fehler: Eingabe für Artikel 15006 ist schlecht" zum Log gehen. Kein Absturz meiner gesamten JSON-String-Verarbeitung Aufgabe.

Ist dies nur eine schlecht geschriebene Bibliothek oder ist es möglich, sie subtiler zu konfigurieren?

Edit: hier einige Telefonvorwahl:

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

Sie sagen, dass man den Typ eines Elements nicht überprüfen kann? –

+0

Vielleicht? Ich weiß nicht, ob dieser Fehler von meiner Syntaxanalysezeile oder meiner Zugriffszeile stammt, weil es nicht so ist, als ob Sie einen Aufruf-Stack oder eine benutzerdefinierte Fehlermeldung oder ähnliches erhalten würden. – djechlin

+0

Sie rufen 'operator []' für einen Wert auf, sagen ein int oder eine Zeichenfolge. –

Antwort

4

Gemäß der Bibliothek Referenz:

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

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

scheint, dass Sie versuchen, operator[] auf einem Nicht-Objekt aufrufen, sagen eine ganze Zahl oder eine Zeichenfolge (get intern verwendet operator[]). Sie brechen die Vorbedingung der Funktion, und es ist ein Fehler auf Ihrer Seite des Codes, nicht die Bibliothek. Sie könnten überprüfen, ob das Objekt Json::Value ein Objekt ist, bevor Sie mit isObject() darauf zugreifen.

4

Wie ich aus dem JsonCpp Sourceforge Repo ersehen kann, sind Assertions jetzt nicht abfangbar (allerdings scheint es in ihrem Rückstand zu sein, Throw Assertions zu erzeugen).

Dann müssen Sie testen, ob die Eingabe gültig ist, bevor Sie den Operator [] aufrufen.

Ein Link zum Quellcode der neuesten Version (Ich weiß nicht, welche Version Sie haben). Siehe Zeile 1141: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup

+2

Behauptungen können jetzt Ausnahmen sein: https://github.com/open-source-parsers/jsoncpp/pull/174 – cdunn2001