c++ - Protocol Buffers C++ 中的异常处理

标签 c++ exception exception-handling protocol-buffers

我在 Protocol Buffers 文档中找不到任何有关 C++ 异常处理的内容。在 Javadoc 中它有明确的定义,如 InvalidProtocolBufferException,但在 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.

source code message_lite.cc 全部用“GOOGLE_DCHECK”或“InitializationErrorMessage”包裹...

我的应用程序不允许这样的异常停止程序(不确定 C++ 中的术语是什么,但基本上没有 UncheckedExceptions),所以我真的需要一种方法来捕获这些异常、记录错误并优雅地返回,以防万一消息被严重损坏。反正有这样做吗?为什么我会看到 this post指示某种 google::protobuf::FatalException 但我找不到关于它的文档(只有 FatalException 可能还不够)。

谢谢!

最佳答案

您看到的失败表明您的程序中存在错误——该程序已请求序列化一条消息,而没有先填写所有必填字段。将其视为段错误。您不应该 try catch 此异常 - 您应该修复您的应用程序,以便从一开始就不会发生异常。

请注意,检查是 DCHECK,这意味着它仅在调试版本中检查。在您的发布版本中(定义 NDEBUG 时),将跳过此检查并写入消息,即使它无效也是如此。因此,您不必担心这会使您的应用程序在生产环境中崩溃,只需在调试时即可。

(从技术上讲,您可以捕获 google::protobuf::FatalException,但 Protobuf 代码最初并非设计为异常安全的。最初,检查失败只会中止程序。它看起来像FatalException 是最近添加的,但由于代码不是异常安全的,因此每次抛出 FatalException 时都可能发生内存泄漏。因此,您可能应该将其视为 abort()。)

关于c++ - Protocol Buffers C++ 中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29640586/

相关文章:

c++ - "d"中的 "double x = 0.0d;"是 g++ 扩展吗?

c++ - DLL 和完全专用的模板类

.net - 从您的方法返回异常是不好的做法

PhpStorm 检查错误或错误代码? try block 中未抛出的异常是意外的

c# - Web API 2 OData错误消息作为XML返回

c++ - 未创建具有 fstream 对象的文件对象

php - OPENSSL Blowfish CBC 加密不同于 PHP 到 C++

java - hibernate :OutOfMemoryError: PermGen space

java - 如何知道确切的函数抛出异常(Java)?

android - 异常无效限制条款 - Android