2012-06-01 17 views
6

Nie jestem pewien, czy będzie to specyficzna cecha jsoncpp, czy ogólny paradygmat, jak sprawić, by biblioteka C++ zachowywała się lepiej. Zasadniczo otrzymuję ten ślad:Bardziej zgrabna obsługa błędów w bibliotece 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. 

To się dzieje, gdy dane wejściowe są złe. Kiedy dane wejściowe - pochodzące z innej aplikacji za pośrednictwem memcached - są złe, chciałbym poradzić sobie z tym błędem. Wiesz, z wdziękiem. Być może coś takiego jak "błąd: dane wejściowe dla pozycji 15006 jest złe" przechodzenie do dziennika. Nie powoduje awarii całego mojego zadania przetwarzania ciągu JSON.

Czy jest to po prostu źle napisana biblioteka, czy też można ją bardziej subtelnie skonfigurować?

Edycja: Oto niektóre kod wywołujący:

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

Czy mówisz, że nie można sprawdzić typu elementu? –

+0

Może? Nie wiem, czy ten błąd pochodzi z mojego wiersza analizowania, czy z mojego wiersza dostępu, ponieważ nie jest tak, że asserts daje stos wywołań lub niestandardowy komunikat o błędzie lub cokolwiek innego. – djechlin

+0

Nazywasz 'operator []' na wartości, na przykład int lub ciąg. –

Odpowiedz

4

Według odniesienia Biblioteka:

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

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

wydaje próbujesz zadzwonić operator[] na brak obiektu, powiedzmy liczbę całkowitą lub ciąg (get wewnętrznie używa operator[]). Przerywasz warunek wstępny funkcji, a jest to błąd po twojej stronie kodu, a nie w bibliotece. Możesz sprawdzić, czy Json::Value jest obiektem, zanim uzyskasz do niego dostęp, korzystając z isObject().

4

Jak widzę z repozytorium JSONCpp Sourceforge, teraz twierdzenia nie są łatwe do odczytania (jednak wydaje się, że w ich zaległościach znajdują się twierdzenia dotyczące rzucania).

Następnie należy sprawdzić, czy dane wejściowe są prawidłowe przed wywołaniem operatora [].

Link do kodu źródłowego najnowszej wersji (nie znam wersji, którą posiadasz). Zobacz linię 1141: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup

+2

Asercje mogą być teraz wyjątkami: https://github.com/open-source-parsers/jsoncpp/pull/174 – cdunn2001