我正在编写一个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示例)。在一天结束时,代码看起来非常混乱。
修改
我有时会使用包装器处理错误。
答案 0 :(得分:1)
编写错误安全代码很难。在您的伪代码中,您实际上根本不处理错误。 errorcode只会得到“close_everything()”的结果 - 即使其他一切都出错也可能成功。
在C ++中解决此类事情的典型方法是为每个“资源”(例如“设备”)创建一个对象,如果出现问题则throw
和exception
不要指望从中恢复。将整个函数[或一组外部函数]包装在try/catch
块中。
当然,如果“失败是正常的”(例如,您尝试从网络端口读取,并且由于没有可用数据而导致超时,那么您应该抛出异常)。这应该使用返回值。
请注意,使用对象来处理资源需要仔细设计代码,尤其是析构函数在清除异常后会在异常后运行。如果在构造函数中抛出异常,请确保不要遗漏 - 因为这就是泄漏的方法。
自然有很多其他解决方案 - 毕竟,我们正在谈论编程,所以总有至少11种不同的方法来解决问题。