[英]Exception handling in Protocol Buffers C++
我在 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.
message_lite.cc 的源代码全部用“GOOGLE_DCHECK”或“InitializationErrorMessage”包裹...
我的应用程序不允许这样的异常停止程序(不确定 C++ 中的术语是什么,但基本上没有 UncheckedExceptions),所以我真的需要一种方法来捕获这些、记录错误并优雅地返回,以防某些消息受到严重影响损坏。 反正有这样做吗? 为什么我看到这篇文章指出某种google::protobuf::FatalException
但我找不到它周围的文档(只有 FatalException 可能还不够)。
谢谢!
您看到的失败表明您的程序中存在错误——该程序请求序列化一条消息,而没有先填写所有必填字段。 将此视为分段错误。 你不应该试图捕捉这个异常——你应该修复你的应用程序,这样异常从一开始就不会发生。
请注意,检查是DCHECK
,这意味着它仅在调试版本中检查。 在您的发布版本中(定义NDEBUG
时),将跳过此检查并写入消息,即使它无效。 因此,您不必担心这会在生产中使您的应用程序崩溃,只有在调试时。
(从技术上讲,您可以捕获google::protobuf::FatalException
,但是 Protobuf 代码最初并不是设计为异常安全的。最初,检查失败只会中止程序。看起来FatalException
是最近添加的,但由于代码是不是异常安全的,很可能在任何时候抛出FatalException
时都会发生内存泄漏。因此,您可能应该将其视为abort()
。)
我解决了我的问题和你一样。 如果在您进行序列化时另一个线程更改了原型项目的大小,那么 FatalException 抛出然后首先我将其复制到另一个原型项目中,然后我会对其进行序列化。
ProtoInput item; // it is global object
.
.
.
fstream output("myfile",
ios::out | ios::trunc | ios::binary);
ProtoInput in;
in.CopyFrom(item);
size_t size = in.ByteSizeLong();
void *buffer = malloc(size);
if (in.SerializeToArray(buffer, size) == true) {
output.write((char *) buffer, size);
}
output.close();
free(buffer);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.