2015-02-13 3 views
2

Я новичок в protobuf (C++) и попробую написать первую тестовую программу с protobuf. КодексОбработка ошибок в protobuf

#include <cstdlib> 
#include <iostream> 
#include "proto/req.pb.h" 

using namespace std; 
using namespace google::protobuf; 

int main(int argc, char** argv) { 
     std::string s = "asdfasdf"; 

     auto MyLogHandler = [] (google::protobuf::LogLevel level, const char* filename, int line, const std::string& message) 
     { 
      std::cout << "message " << message << std::endl; 
     }; 
     google::protobuf::SetLogHandler(MyLogHandler); 

     Request req; 
     if (req.ParseFromString(s)){ 
      cout << "Parse - OK" << endl; 
     }else{ 
       cout << "Parse - ERROR" << endl; 
     } 
     return 0; 
    } 

При запуске программы - это показывает только сообщение об ошибке, но не какой-либо причине об этом. Как я могу получить причину ошибки?

ответ

3

Есть две причины Protobuf разборе может потерпеть неудачу:

  • Входные данные отсутствуют необходимые поля. В этом случае библиотека Protobuf записывает сообщение журнала, описывающее проблему, а затем возвращает false. В этом случае ваш обработчик журнала получит сообщение об ошибке.

  • Ввод данных не является допустимым Protobuf (он поврежден или никогда не был протобуфом в первую очередь). В этом случае библиотека Protobuf просто возвращает false без сообщения об ошибке. На самом деле нет никакой полезной информации, которую библиотека могла бы предоставить здесь. Если это произойдет с вами, лучшим способом отладки является сброс точных байтов сразу после сериализации сообщения и прямо перед его анализом, а затем искать различия.

+0

Это было не сообщение protobuf. Некоторое странное поведение с библиотекой protobobuf тихо возвращает false без каких-либо обозначений. – Nikolay

+0

@Nikolay - Да, ваши фиктивные входные данные попадают во вторую категорию. Как я уже сказал, библиотека protobuf не дает вам никакой информации, потому что нет никакой полезной информации. 'false' означает, что данные не являются протобуфом. Вот и все. (Это не «молчание». «Тихий» будет, если он вернется «истина», даже если сообщение недействительно.) –

Смежные вопросы