gpt4 book ai didi

c++ - 替代 C++ 异常

转载 作者:IT老高 更新时间:2023-10-28 22:34:41 25 4
gpt4 key购买 nike

我正在编写一个响应式(Reactive)软件,它反复接收输入、处理输入并发出相关输出。主循环看起来像:

initialize();
while (true) {
Message msg,out;
recieve(msg);
process(msg,out);
//no global state is saved between loop iterations!
send(out);
}

我希望在处理阶段发生的任何错误,无论是内存不足错误、逻辑错误、无效断言等,程序都会清理它所做的一切,并继续运行。我会假设它是无效的输入,并忽略它。

C++ 的异常非常适合这种情况,我可以用 try/catch 子句包围 process,并在出现问题时抛出异常。我唯一需要确保在引发异常之前清理所有资源。这可以通过 RAII 进行验证,或者通过编写全局资源分配器(例如,如果您的析构函数可能抛出异常),并将其专门用于所有资源。

Socket s = GlobalResourceHandler.manageSocket(new Socket());
...
try {
process(msg,out);
catch (...) {
GlobalResourceHandler.cleanUp();
}

但是,在我们的编码标准中(也在 Google's C++ standard BTW 中)禁止使用异常,因此所有代码都是在关闭异常的情况下编译的,我相信没有人会为了我的设计问题而改变一切的工作方式.

另外,这是嵌入式平台的代码,所以我们使用的 C++ 额外功能越少,代码变得越快,并且更便携。

我可以考虑其他设计吗?

更新:我感谢大家对愚蠢代码标准的回答。我唯一能说的是,在大型组织中,你必须有严格的,有时甚至是不合逻辑的规则,以确保没有白痴会来让你的好代码无法维护。该标准更多地是关于人而不是技术性。是的,坏人可以把每个代码都弄得一团糟,但如果你给他额外的工具来完成这项任务,情况会更糟。

我仍在寻找技术的答案。

最佳答案

整天编写此类服务我了解您的问题。尽管我们的代码中确实存在异常,但我们不会将它们返回给调用它的外部库,而是使用一个简单的“tribool”。

enum ReturnCode
{
OK = 0, // OK (there is a reason for it to be 0)
KO, // An error occurred, wait for next message
FATAL // A critical error occurred, reboot
};

我必须说 FATAL 是……异常的。除了初始化之外,应用程序中没有任何代码路径返回它(如果您没有正确初始化,则无法做很多事情)。

C++ 在这里为 RAII 带来了很多好处,因为它笑了多个返回路径并保证它所持有的对象的确定性释放。

对于实际的代码检查,您可以简单地使用一些宏:

// Here is the reason for OK being 0 and KO and Fatal being something else

#define CHECK_RETURN(Expr) if (ReturnCode code = (Expr)) return code;

#define CHECK_BREAK(Expr) if (ReturnCode code = (Expr)) \
if (KO == code) break; else return code;

然后你可以像这样使用它们:

CHECK_RETURN( initialize() )
while(true)
{
Message msg,out;
CHECK_BREAK( receive(msg) )
CHECK_BREAK( process(msg,out) )
CHECK_BREAK( send(out) )
}

如前所述,真正令人沮丧的是构造函数。在这种情况下,你不能有“正常”的构造函数。

也许你可以使用 boost::optional,如果你不能,我真的建议复制该功能。将其与代替构造函数的系统工厂函数结合起来,您就可以开始了:

boost::optional<MyObject> obj = MyObject::Build(1, 2, 3);
if (!obj) return KO;

obj->foo();

看起来很像一个指针,只是它是在堆栈中分配的,因此开销几乎为零。

关于c++ - 替代 C++ 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2950260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com