如何设置错误处理语句的格式

How are error-handling statements formatted?

本文关键字:处理 语句 格式 错误 何设置 设置      更新时间:2023-10-16

我有几个函数,如果遇到错误,则返回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;

还是有另一种更好的方法可以做到这一点?我以前从未编写过代码来解释错误,所以我在这里的经验相当有限。

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

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

看不出上述两种方法之间的区别。

我会使用例外,更干净的方法重新评论。 为什么要重新发明轮子?您可以使用标准异常或实现自定义异常,如

你也可以使用它,

return low_level_function();

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

return low_level_function()>0? 1 : 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;
}