如何获取有关protobuf解析期间生成的错误的更多详细信息?(C ++)

伦纳特·罗兰(Lennart Rolland)

我是protobuf(C ++)的新手,我的代码在解析消息期间失败。如何获得有关发生的错误的更多详细信息?

例子

以下代码段说明了该问题:

const bool ok=my_message.ParseFromCodedStream(&stream);
if(ok){
    std::cout<< "message parsed. evidence:\n"<< my_message.DebugString();
}
else{
    std::cerr<< "error parsing protobuf\n";
    //HOW CAN I GET A REASON FOR THE FAILURE HERE?
}
深渊7

如果您查看protobuf代码,就会发现它使用的是自己的基于宏的日志记录系统。默认情况下,所有这些消息都发送到stderr,但是您可以使用SetLogHandler()以下命令在程序中捕获它们

typedef void LogHandler(LogLevel level, const char* filename, int line,
                        const std::string& message);

可能的解决方案是建立自己的类似errno机制(对C ++ 11-ishness感到抱歉):

typedef LogMessage std::tuple<LogLevel, std::string, int, std::string>;  // C++11
typedef LogStack std::list<LogMessage>;

namespace {

LogStack stack;
bool my_errno;

}  // namespace

void MyLogHandler(LogLevel level, const char* filename, int line,
                  const std::string& message) {
  stack.push_back({level, filename, line, message});  // C++11.
  my_errno = true;
}

protobuf::SetLogHandler(MyLogHandler);

bool GetError(LogStack* my_stack) {
  if (my_errno && my_stack) {
    // Dump collected logs.
    my_stack->assign(stack.begin(), stack.end());
  }

  stack.clear();
  bool old_errno = my_errno;
  my_errno = false;

  return old_errno;
}

并在您的代码中使用它:

...
else {
    std::cerr<< "error parsing protobuf" << std::endl;
    LogStack my_stack;
    if (GetError(&my_stack) {
      // Handle your errors here.
    }
}

我的示例代码的主要缺点-不适用于多个线程。但这可以自己解决。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何获得有关猫鼬错误消息的更多详细信息?

如何获取有关“ sudo”失败的详细信息

有什么方法可以获取有关GCM故障的更多详细信息?

在Visual Studio(即时窗口)中获取有关已处理异常的更多详细信息

KendallTau:尝试在 stats.py 中获取有关 weightedtau() 的更多详细信息

有关CRM错误的更多详细信息:“解决方案清单导入:失败”

如何查找有关无效证书的更多详细信息

如何使用kubectl了解有关先前推出的修订的更多详细信息?

如何找到有关 CsvHelper.TypeConversion.CsvTypeConverterException 的更多详细信息?

Oracle DDL 触发器:如何检索有关发生的事件的更多详细信息?

Jest - 如何获得有关不间断测试的更多详细信息?

如何找到有关特定Yodlee帐户类型的更多详细信息?

如何获取有关异常错误的更多信息?

如何获取有关python错误的更多信息?

获取有关网络位置配置的详细信息

获取有关新闻标记的特定详细信息

如何使用 gridview 中记录的信息在 C# ASP.NET 的新页面中打开有关该记录的更多详细信息?

如何获取有关未安装的软件包的详细信息?

如何在pokeAPI中获取有关神奇宝贝的详细信息

如何在iOS中获取有关AGSFeature层的详细信息

从函数中,如何获取有关实际调用此函数的模块的详细信息?

如何打开扩展名为pcxm的文件并获取有关它们的详细信息

如何获取有关Windows 7中内存问题的特定详细信息

Python单击:如何打印有关使用错误的完整帮助详细信息?

Firestore:“缺少权限或权限不足”是否可以定义或检索有关错误的更多详细信息?

Ubuntu初始化脚本失败-试图找出有关该错误的更多详细信息

如何查看有关Firebase JavaScript客户端正在执行的操作的更多详细信息?

有关更多详细信息,请参见:'go help gopath'

获取有关Gradle构建错误的更多信息