gpt4 book ai didi

c++ - 过程硬件编程的错误处理技术

转载 作者:行者123 更新时间:2023-11-28 07:48:36 27 4
gpt4 key购买 nike

我正在编写一个 C++ 代码来控制一个特殊设备,该设备是几个 SDK 的融合。我的代码看起来像

#define sdk1SafeCall(err) __sdk1SafeCall(err,__FILE__,__LINE__)

int errorcode = 0;
sdk1SafeCall(sdk1_InitializeDevice());
errorcode=sdk2_InitializeDevice();
errorcode=sdk3_InitializeDevice();

if (some_parameter)
{
errorcode=sdk2_readDevice(true);
}
else
{
errorcode=sdk3_writeDevice();
}
label again: errorcode=sdk1_readDevice();
if (error) goto again;

errorcode=close_everything();

使用参数将重新安排控制流程。我当前的方法使用类似 cudaSafeCall 的方法来包装错误代码并退出。我不知道该怎么做的是在哪里存储这些错误的详细解释或如何从中恢复(例如 goto 示例)。在一天结束时,代码看起来真的很乱。

编辑

我有时会使用包装器处理错误。

最佳答案

编写防错代码很困难。在您的伪代码中,您实际上根本不处理错误。 errorcode 只会有“close_everything()”的结果——它可能已经成功,即使其他一切都出错了。

在 C++ 中解决这类问题的典型方法是为每个“资源”(例如“设备”)创建一个对象,然后抛出一个异常如果出现您不希望从中恢复的错误。将整个函数 [或外部函数集] 包装在 try/catch block 中。

当然,如果“失败是正常的”(例如,您尝试从网络端口读取数据,并且因为没有可用数据而超时,那么您不应该为此抛出异常)。这应该使用返回值。

请注意,使用对象来处理资源需要仔细设计代码,尤其是您的析构函数在异常发生后运行时可以很好地清理它。如果在构造函数中抛出异常,请确保不要遗漏任何东西——因为这就是泄漏的原因。

自然有一大堆其他解决方案 - 毕竟,我们在谈论编程,所以总是至少有 11 种不同的方法来解决问题。

关于c++ - 过程硬件编程的错误处理技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327809/

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