【问题标题】:More graceful error handling in C++ library - jsoncppC++ 库中更优雅的错误处理 - jsoncpp
【发布时间】:2012-06-06 20:06:08
【问题描述】:

我不确定这是否会是 jsoncpp 的特定事物,还是如何使 C++ 库表现更好的一般范例。基本上我得到了这个跟踪:

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 字符串处理任务崩溃。

这只是一个写得不好的库还是可以更巧妙地配置它?

编辑:这是一些调用代码:

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();

【问题讨论】:

  • 你是说不能检查元素的类型?
  • 也许吧?我不知道这个错误是来自我的解析行还是我的访问行,因为它不像断言给你一个调用堆栈或自定义错误消息或任何东西。
  • 你在一个值上调用operator[],比如一个int或一个字符串。
  • 添加了我的客户代码。在访问之前我应该​​做一个检查吗?我认为这就是我的默认值 "" 的用途。

标签: c++ error-handling assert fault-tolerance jsoncpp


【解决方案1】:

根据库参考:

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

通过名称访问对象值,如果不存在则创建一个空成员。

您似乎试图在非对象上调用operator[],例如整数或字符串get 内部使用operator[]。您正在破坏函数的前提条件,并且它是您的代码错误,而不是库。您可以在使用isObject() 访问它之前检查Json::Value 是否是一个对象。

【讨论】:

    【解决方案2】:

    正如我从 JsonCpp Sourceforge 存储库中看到的那样,现在断言是不可捕获的(但似乎在他们的积压中进行抛出断言)。

    然后,您必须在调用 [] 运算符之前测试输入是否有效。

    最新版本的源代码链接(我不知道你的版本)。见第 1141 行: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多