2012-06-01 2 views
6

Я не уверен, что это будет конкретная вещь с jsoncpp или общей парадигмой, как заставить C++-библиотеку вести себя лучше. В основном я получаю этот след:Более грациозная обработка ошибок в 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. 

Это происходит, когда ввод плох. Когда вход - который поступает из другого приложения моего через memcached - оказывается плохой, я хотел бы обработать эту ошибку. Вы знаете, изящно. Возможно, что-то вроде «ошибка: вход для элемента 15006 - это плохо», идущий в журнал. Не сбой всей моей задачи обработки строк JSON.

Это просто плохо написанная библиотека или можно настроить ее более тонко?

Edit: вот некоторый код вызова:

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

Вы не можете проверить тип элемента? –

+0

Может быть? Я не знаю, возникает ли эта ошибка из моей строки синтаксического анализа или моей линии доступа, потому что это не похоже на то, что утверждения дают вам стек вызовов или настраиваемое сообщение об ошибке или что-то еще. – djechlin

+0

Вы вызываете 'operator []' на значение, например int или строку. –

ответ

4

Согласно справке библиотеки:

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

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

Кажется, вы пытаетесь вызвать operator[] на не-объекте, скажем, целое число или строку (get внутренне использует operator[]). Вы нарушаете предварительное условие функции и его ошибку на вашей стороне кода, а не в библиотеке. Вы можете проверить, является ли объект Json::Value объектом, прежде чем обращаться к нему как таковым, используя isObject().

4

Как я вижу из репо JsonCpp Sourceforge, прямо сейчас утверждения не являются уловчивыми (однако, похоже, в их отставании возникают метательные утверждения).

Затем вам нужно будет проверить, действительно ли вход действителен перед вызовом оператора [].

Ссылка на исходный код новой версии (у меня нет версии). См. Строку 1141: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup

+2

Теперь вместо утверждений могут быть исключения: https://github.com/open-source-parsers/jsoncpp/pull/174 – cdunn2001

 Смежные вопросы

  • Нет связанных вопросов^_^