2015-04-15 63 views
3

在Protocol Buffers文檔中找不到C++中異常處理的任何內容。在Javadoc中它有明確定義的像InvalidProtocolBufferException,但不在C++中。Protocol Buffers中的異常處理C++

有時候,我跑我的程序,並在找到丟失的字段在它認爲一個有效的信息,那麼它只是停止並拋出象這樣的錯誤崩潰:

[libprotobuf FATAL google/protobuf/message_lite.cc:273] CHECK failed: 
IsInitialized(): Can't serialize message of type "XXX" because it is 
missing required fields: YY, ZZ 
unknown file: Failure 
C++ exception with description "CHECK failed: IsInitialized(): Can't 
serialize message of type "XXX" because it is missing required fields: 
YY, ZZ" thrown in the test body. 

message_lite.cc所有的source code包裹「GOOGLE_DCHECK」或「InitializationErrorMessage」... ...

我的應用程序不允許這樣的異常停止程序(不知道C++中的術語是什麼,但基本上沒有UncheckedExceptions),所以我真的需要一種方法來抓住這些,記錄錯誤,並適度地返回,以防某些消息嚴重c orrupted。反正有這樣做嗎?爲什麼我看到this post指示某種google::protobuf::FatalException,但我無法找到它的文檔(只有FatalException可能還不夠)。

謝謝!

回答

8

您看到的失敗表明您的程序中存在一個錯誤 - 該程序已經請求序列化一條消息,而未先填寫所有必填字段。把這看成是一個分段錯誤。你不應該試圖去捕捉這個異常 - 你應該修復你的應用程序,以避免在第一時間發生異常。

請注意,檢查是DCHECK,這意味着它只在調試版本中檢查。在發佈版本中(當定義NDEBUG時),該檢查將被跳過,即使該信息無效,該信息也會被寫入。所以,您不必擔心這會在調試時使應用程序崩潰。

(從技術上講,你能趕上google::protobuf::FatalException,但的Protobuf代碼不是最初設計是異常安全的。本來,檢查故障只會退出程序。它看起來像FatalException最近才加入,但由於代碼不例外 - 安全,這可能是因爲你在FatalException的時候會出現內存泄漏,所以你可能應該像abort()那樣對待它。)

+0

謝謝! Protobuf如何認識到自己是處於生產模式還是處於DEBUG模式?對於我的情況,是因爲我在Google Test中使用它,所以它會自動計算出它的DEBUG? 聽起來沒什麼異常,因爲我猜這是爲了與普通的Java和C++約定保持一致?因爲所有這些「InvalidBufferException」的東西都被模擬爲異常,如果它在Java中,但也許它是預期的,就像你不能在Java中有段錯誤一樣...... – Superziyi

+0

@Superziyi如果你用'NDEBUG' #defined編譯protobufs,那麼它是在釋放模式下,否則它處於調試模式(NDEBUG =不調試)。如果你使用的是unix,並且使用了常規配置,make,make install來構建protobufs,默認情況下它應該處於release模式(當你運行'configure'時可以通過設置'CXXFLAGS'來覆蓋)。如果你在Windows上,MSVC通常在發佈配置中定義'NDEBUG'。 (NDEBUG宏是一個標準的C-ism。) –