0

我正在编写一个 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 示例)。归根结底,代码看起来真的很乱。

编辑

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

4

1 回答 1

1

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

在 C++ 中解决此类问题的典型方法是为每个“资源”(例如“设备”)设置一个对象,以及throw如果exception出现您不希望从中恢复的问题。将整个函数 [或一组外部函数] 包装在一个try/catch块中。

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

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

当然还有很多其他的解决方案——毕竟,我们在谈论编程,所以总是有至少 11 种不同的方法来解决问题。

于 2013-01-14T22:32:20.497 回答