我在 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/