2012-06-01 19 views
6

मुझे यकीन नहीं है कि यह jsoncpp या सी ++ लाइब्रेरी को बेहतर तरीके से व्यवहार करने के तरीके के साथ एक सामान्य प्रतिमान होगा। असल में मुझे यह निशान मिल रहा है:सी ++ लाइब्रेरी में अधिक सुन्दर त्रुटि हैंडलिंग - 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-string-process कार्य को क्रैश नहीं कर रहा है।

क्या यह सिर्फ एक बुरी तरह लिखित लाइब्रेरी है या क्या इसे अधिक संक्षेप में कॉन्फ़िगर करना संभव है?

संपादित करें:,

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

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

लगता है आप एक गैर वस्तु पर operator[] कॉल करने के लिए कोशिश कर रहे हैं एक पूर्णांक या एक स्ट्रिंग कहते हैं: यहाँ कुछ बुला कोड है:

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

आप एक मूल्य पर 'ऑपरेटर []' को कॉल कर रहे हैं, एक int या स्ट्रिंग कहें। –

उत्तर

4

पुस्तकालय संदर्भ के अनुसार (get आंतरिक रूप से operator[] का उपयोग करता है)। आप फ़ंक्शन पूर्व शर्त को तोड़ रहे हैं, और यह कोड के आपके पक्ष में एक त्रुटि है, पुस्तकालय नहीं। आप देख सकते हैं कि Json::ValueisObject() का उपयोग कर इसे एक्सेस करने से पहले एक ऑब्जेक्ट है या नहीं।

4

जैसा कि मैं जेसनसीपी स्रोतफोर्ज रेपो से देखता हूं, अभी दावे को पकड़ने योग्य नहीं हैं (हालांकि यह फेंकने के लिए उनके बैकलॉग में लगता है)।

फिर, आपको परीक्षण करना होगा कि [] ऑपरेटर को कॉल करने से पहले इनपुट मान्य है या नहीं।

नवीनतम संशोधन के स्रोत कोड का एक लिंक (मुझे आपके पास संस्करण नहीं पता है)। लाइन 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