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

Len*_*and 12 c++ error-handling protocol-buffers

我是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?
}
Run Code Online (Sandbox Code Playgroud)

aby*_*s.7 14

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

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

可能的解决方案是创建自己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;
}
Run Code Online (Sandbox Code Playgroud)

并在您的代码中使用它:

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

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

  • 第一:永远不要 (IMO) 为使用 C++11 而道歉。第二:谢谢你的好回答:-) (3认同)