【问题标题】:How are error-handling statements formatted?错误处理语句是如何格式化的?
【发布时间】:2012-05-04 15:43:14
【问题描述】:

如果遇到错误,我有一些函数会返回 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;

或者还有其他更好的方法吗?我以前从未编写过代码来解释错误,所以我在这里的经验相当有限。

编辑:我已重新格式化函数以更好地传达我的代码的性质。

【问题讨论】:

  • return low_level_function(); 怎么样?如果你需要它之​​间的东西,int error = low_level_function(); ...; return error;。很多人都会同意return condition;return (condition ? true : false);
  • 你看过异常吗?
  • @111111:OP 可能并不是有意将其标记为 C++(根据通常的 C++ 和 C 组合标记判断)。
  • @sixlettervariables,如果他们确实使用 C++,我认为这不是不提它的好理由。
  • 在编写示例代码时,我忽略了该函数不仅仅是从低级函数返回错误的事实。该问题已被编辑以反映这一点。

标签: c++ c error-handling


【解决方案1】:

选择第二种形式的一个原因是当您在错误情况下无事可做并且想要避免嵌套 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();

【讨论】:

  • 您的第一个/上层提案是我最喜欢的替代我自己的答案...,尽管我声称在对错误标志进行大量测试的情况下它的效率较低。从我的独奏中直接突破可能有助于编译器更好地理解作者想告诉他的内容...... ;-)
【解决方案2】:

我看不出上面两种方法的区别。

我会推荐使用exception,更简洁的方法。为什么要重新发明轮子?您可以使用标准异常或实现自定义异常like

【讨论】:

  • 最终使用了异常,因为错误处理层次结构很快就失去了控制。
【解决方案3】:

你也可以用这个,

return low_level_function();

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

return low_level_function()>0? 1 : 0;

【讨论】:

  • 技术上第二个例子可以写成return !!low_level_function();。这确实是个人喜好。
【解决方案4】:

虽然这是附带评论,但我将首先声明我更喜欢 one 退出任何方法。

他的构造的一个主要优点是可以只在一个地方需要一个错误记录语句。

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

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

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多