2012-06-01 30 views
6

Tôi không chắc liệu đây có phải là một điều cụ thể với jsoncpp hay một mô hình chung với cách làm cho thư viện C++ hoạt động tốt hơn. Về cơ bản, tôi nhận được dấu vết này:Xử lý lỗi duyên dáng hơn trong thư viện 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. 

Điều đó xảy ra khi đầu vào kém. Khi đầu vào - mà đến từ một ứng dụng khác của tôi thông qua memcached - xảy ra là xấu, tôi muốn xử lý lỗi này. Bạn biết đấy, duyên dáng. Có lẽ một cái gì đó như, "lỗi: đầu vào cho mục 15006 là xấu" đi vào nhật ký. Không làm hỏng toàn bộ tác vụ xử lý chuỗi JSON của tôi.

Đây có phải chỉ là một thư viện được viết kém hoặc có thể cấu hình nó tinh tế hơn không?

Edit: đây là một số mã gọi:

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

Bạn đang nói người ta không thể kiểm tra loại phần tử? –

+0

Có thể? Tôi không biết nếu lỗi này đến từ dòng phân tích cú pháp của tôi hoặc đường truy cập của tôi bởi vì nó không giống như xác nhận cung cấp cho bạn một ngăn xếp cuộc gọi hoặc thông báo lỗi tùy chỉnh hoặc bất cứ điều gì. – djechlin

+0

Bạn đang gọi 'toán tử []' trên một giá trị, giả sử một int hoặc một chuỗi. –

Trả lời

4

Theo tài liệu tham khảo thư viện:

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

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

Có vẻ bạn đang cố gắng gọi operator[] vào một tổ chức phi vật thể, nói một số nguyên hoặc một chuỗi (get sử dụng nội bộ operator[]). Bạn đang phá vỡ điều kiện tiên quyết chức năng và lỗi của nó ở bên cạnh mã của bạn, không phải là thư viện. Bạn có thể kiểm tra xem Json::Value là một đối tượng trước khi truy cập nó như vậy bằng cách sử dụng isObject().

4

Như tôi thấy từ repo JsonCpp Sourceforge, ngay bây giờ các xác nhận không thể bắt được (tuy nhiên có vẻ như trong phần tồn đọng của chúng để tạo các xác nhận ném).

Sau đó, bạn sẽ phải kiểm tra xem đầu vào có hợp lệ hay không trước khi gọi toán tử [].

Liên kết tới mã nguồn của bản sửa đổi mới nhất (Tôi không biết phiên bản bạn có). Xem dòng 1141: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup

+2

Các xác nhận có thể là ngoại lệ thay thế ngay bây giờ: https://github.com/open-source-parsers/jsoncpp/pull/174 – cdunn2001

Các vấn đề liên quan