错误处理语句是如何格式化的?

时间:2012-05-04 15:43:14

标签: c++ c error-handling

如果遇到错误,我有几个返回1的函数。每个函数都调用一个低级函数,这样如果低级函数返回1,原始函数也返回1。因此,错误会以这种方式传递到链中。

以下是其中一个功能的高度删节版本:

if (low_level_function()) {
    [do stuff]
    return 1;
}
[do other stuff]
return 0;

我是否应该声明一个错误变量,将low_level_function()的结果赋给它,然后在if()语句中使用错误变量?换句话说:

int error = low_level_function();
if (error) {
    [do stuff]
    return 1;
}
[do other stuff]
return 0;

或者还有另一种更好的方法吗?我以前从来没有编码来解释错误,所以我在这里的经历相当有限。

编辑:我重新格式化了这些函数,以更好地传达我的代码的本质。

4 个答案:

答案 0 :(得分:2)

更喜欢第二种形式的一个原因是在错误情况下你没有任何事情可做,而你想避免嵌套if语句的阶梯效应。

int error_flag = low_level_function();
if (!error_flag)
    error_flag = second_function();
if (!error_flag)
    error_flag = third_function();
return error_flag;

当然,对于该特定示例,您可以使用||的短路属性进行简化:

return low_level_function() || second_function() || third_function();

答案 1 :(得分:1)

你也可以使用它,

return low_level_function();

如果 low_level_function()在错误时返回非零值,在成功时返回零。或

return low_level_function()>0? 1 : 0;

答案 2 :(得分:1)

我没有看到上述两种方法之间的区别。

我建议使用exception更清洁的方法。为什么重新发明轮子?您可以使用标准异常或实现自定义异常like

答案 3 :(得分:0)

虽然它是侧面评论我将首先声明我更喜欢一个退出任何方法。

他的构造的一个主要优点是只需要在一个地方需要错误记录声明。

此外,添加跟踪日志以进行调试也非常容易。

所以按照这个想法,我建议以下

#define OK (0)

int mid_level_func(....)
{
  log_entry(...);

  int rc = OK

  {
    ...

    if ((rc = low_level_func1(...)))
      goto lblExit;

    ...

    if ((rc = low_level_func2(...)))
      goto lblExit;

    ...

    lblExit:
    ;
  }

  if (OK != rc)
    log_error(rc, ...);

  log_exit(...);

  return rc;
}

对于那些坚持goto“邪恶”的人,上述方案的以下变体可能有所帮助:

#define OK (0)

int mid_level_func(....)
{
  log_entry(...);

  int rc = OK

  do 
  {
    ...

    if ((rc = low_level_func1(...)))
      break;

    ...

    if ((rc = low_level_func2(...)))
      break;

    ...

  } while (0);

  if (OK != rc)
    log_error(rc, ...);

  log_exit(...);

  return rc;
}