2012-06-01 20 views
6

Non sono sicuro se questa sarà una cosa specifica con jsoncpp o un paradigma generale su come far funzionare meglio una libreria C++. Fondamentalmente sto ottenendo questa traccia:Gestione degli errori più aggraziata nella libreria 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. 

Ciò accade quando l'input è negativo. Quando l'input - che proviene da un'altra mia applicazione tramite memcached - sembra essere cattivo, mi piacerebbe gestire questo errore. Sai, con grazia. Forse qualcosa del tipo, "errore: input per la voce 15006 è male" andando al log. Non si blocca l'intera attività di elaborazione della stringa JSON.

Questa è solo una libreria mal scritta o è possibile configurarla in modo più sottile?

Edit: ecco qualche codice chiamante:

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

Stai dicendo che non è possibile controllare il tipo di un elemento? –

+0

Forse? Non so se questo errore proviene dalla mia linea di analisi o dalla mia linea di accesso perché non è come gli asserti ti danno uno stack di chiamate o un messaggio di errore personalizzato o altro. – djechlin

+0

Si sta chiamando 'operator []' su un valore, si dice un int o una stringa. –

risposta

4

Secondo il riferimento alla libreria:

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

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

Sembra che si sta tentando di chiamare operator[] su un non-oggetto, ad esempio un intero o una stringa (get utilizza internamente operator[]). Stai violando la precondizione della funzione, e si tratta di un errore sul tuo lato del codice, non della libreria. È possibile verificare se Json::Value è un oggetto prima di accedere come tale utilizzando isObject().

4

Come vedo dal repository JSONCpp Sourceforge, in questo momento le asserzioni non sono catchable (tuttavia sembra essere nel loro backlog per fare asserzioni di lancio).

Quindi, è necessario verificare se l'input è valido prima di chiamare l'operatore [].

Un collegamento al codice sorgente della versione più recente (non conosco la versione in uso). Vedi la riga 1141: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup

+2

Ora le asserzioni possono essere eccezioni: https://github.com/open-source-parsers/jsoncpp/pull/174 – cdunn2001