我正在写一个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++中解决这类问题的典型方法是为每个"资源"(例如"设备")和throw
和exception
提供一个对象,如果出现不希望恢复的错误。在try/catch
块中包装整个函数[或函数的外部集合]。
当然,如果"失败是正常的"(例如,你试图从一个网络端口读取,你得到一个超时,因为没有可用的数据,这不是你应该抛出一个异常)。这应该使用一个返回值。
注意,使用对象来处理资源需要仔细设计代码,特别是你的析构函数在异常后运行时要做好清理工作。如果在构造函数中抛出异常,请确保没有留下任何东西——因为这是导致泄漏的原因。
自然有一大堆其他的解决方案——毕竟,我们在讨论编程,所以总是有至少11种不同的方法来解决一个问题。