2012-06-01 23 views
6

No estoy seguro de si esto será algo específico con jsoncpp o un paradigma general sobre cómo hacer que una biblioteca C++ se comporte mejor. Básicamente estoy obteniendo esta traza:Manejo de errores más elegante en la biblioteca 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. 

Eso ocurre cuando la entrada es mala. Cuando la entrada, que proviene de otra aplicación mía a través de memcached, resulta ser incorrecta, me gustaría manejar este error. Ya sabes, con gracia. Tal vez algo así como, "error: entrada para el artículo 15006 es malo" ir al registro. No bloquee toda mi tarea de procesamiento de cadenas JSON.

¿Se trata simplemente de una biblioteca mal escrita o es posible configurarla de forma más sutil?

Editar: aquí hay algo de código de llamada:

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

¿Está diciendo que no se puede verificar el tipo de elemento? –

+0

¿Tal vez? No sé si este error viene de mi línea de análisis o de mi línea de acceso porque no es como si las afirmaciones tuvieran una pila de llamadas o un mensaje de error personalizado o algo así. – djechlin

+0

Está llamando a 'operator []' en un valor, digamos int o una cadena. –

Respuesta

4

De acuerdo con la referencia de la biblioteca:

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

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

Parece que está intentando llamar operator[] en un no-objeto, por ejemplo un entero o una cadena (get internamente usa operator[]). Está incumpliendo la condición previa de la función, y es un error del lado del código, no de la biblioteca. Puede verificar si el Json::Value es un objeto antes de acceder a él como tal usando isObject().

4

Como veo en el repositorio JpoCP Sourceforge, en este momento las aserciones no son detectables (sin embargo, parece estar en su lista de espera para hacer afirmaciones arrojadizas).

Luego, deberá probar si la entrada es válida antes de llamar al operador [].

Un enlace al código fuente de la última revisión (no sé la versión que tiene). Vea la línea 1141: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup

+2

Las aserciones pueden ser excepciones en su lugar ahora: https://github.com/open-source-parsers/jsoncpp/pull/174 – cdunn2001

Cuestiones relacionadas