繁体   English   中英

Protocol Buffers C++ 中的异常处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM