如何在错误检查期间减少冗余代码

时间:2010-10-10 02:34:04

标签: c++

  

注意:限制是我不能使用异常(代码最终编译时禁用异常 - 不受我的控制)。该项目是一个实时3D图形应用程序。

我正在使用我自己的错误类(我已经在不久前发布了一个问题),每个类都使用它。非常简单,它只是在函数调用期间记录错误。该函数返回该错误,也可以通过调用SomeClass->GetLastError()来检查。如果它是NO_ERROR(所有枚举),那么我们可以继续,虽然我们可以选择忽略它(例如,如果某个特定对象没有加载,我们可以忽略它,在它的位置放一个丑陋的粉红色框并标记一个错误)。在创建CreateScene()时调用函数State,然后调用函数来调用负责创建场景的各种函数。所有这些功能都可能会返回错误。所以我接下来就是这样的:

if (CreateGrid() != NO_ERROR)
{
  mCore->Terimate();
  mLog->Error("\n[FATAL] Initialization Failed, check error log");
  return;
}
if (SomeOtherFunc() != NO_ERROR)
{
  mCore->Terimate();
  mLog->Error("\n[FATAL] Initialization Failed, check error log");
  return;
}

调用的函数可能具有不同的函数签名,因此参数可以不同,尽管返回类型始终是整数。我有很多像上面那样的调用,所以我为它写了一个#define,它将函数作为参数,与上面的代码完全相同。现在,上面的代码如下所示:

CALL_FUNC(CreateGrid());
CALL_FUNC(SomeOtherFunc());

完成后,定义是未定义的。无论如何,这是我能想到的唯一想法。即使它有一个丑陋的 #define,结果代码也是干净的。我应该在这里使用更好的技术吗?

由于

2 个答案:

答案 0 :(得分:2)

假设您真的不关心哪个功能失败,或者除了测试返回值之外,还可以通过某种方式确定哪个功能失败,

if (CreateGrid() != NO_ERROR || SomeOtherFunc() != NO_ERROR)
{
    // Handle error
}

答案 1 :(得分:2)

正确答案是“使用例外”,但听起来超出您控制的原因会妨碍您使用理想的解决方案。这是我的另一种选择:考虑goto - 被某些人视为有害,但对C风格的错误检查完全合法。下面是一个示例,请注意所有错误处理都在一个地方,并且您知道错误处理程序中的错误代码,它可以获得异常的一些优点,而不会实际使用异常。

int ret;

if ((ret = CreateGrid()) != NO_ERROR)
    goto Error;

if ((ret = SomeOtherFunc()) != NO_ERROR)
    goto Error;

// ...

Error:
mCore->Terminate();
mLog->Error("\n[FATAL] Initialization Failed, check error log");
// Note that here, 'ret' stores the value of the last error code.
// This may be useful for further diagnostics at this point, and you
// probably want to log it too.
return;