C:返回错误的代码样式?

时间:2012-02-09 20:06:10

标签: c error-handling styles return-value

我的所有功能都是这样的:

short Function()
{
   short ret = 0;

   ret = FunctionA();   
   if(ret != 0) return ret;

   ret = FunctionB();
   if(ret != 0) return ret;

   ret = FunctionC();
   if(ret != 0) return ret;

   return 0;
}

有没有更好的方式来写这个?无需重复

if(ret != 0) return ret;

一直在吗?

8 个答案:

答案 0 :(得分:7)

如果使用其他答案中建议的短路||不是一个选项,您可以为此定义一个宏:

#define TRY(var, x) if ((var = (x))) return var

然后在你的代码中:

short Function()
{
  short ret;

  TRY(ret, FunctionA());
  TRY(ret, FunctionB());
  TRY(ret, FunctionC());

  return 0;
}

注意:决定使用宏时应该非常小心,但在这种情况下,我认为可以是一种解决问题的简洁方法。 但必须提到的是,这些陈述掩盖了这样一个事实,即函数可以在每个函数的早期返回。如果您有开放资源句柄(文件描述符,指向malloc ed数据的指针,......),它们将泄漏。您和使用该代码的每个人都应该意识到这一点,并使用适当的错误处理和清理例程来处理比这个更复杂的情况。

答案 1 :(得分:5)

short Function()
{
   short ret = 0;

   if(
       (ret = FunctionA()) != 0 ||
       (ret = FunctionB()) != 0 ||
       (ret = FunctionC()) != 0
     )
   {
      return ret;
   }

   return 0;
}

答案 2 :(得分:2)

我会走另一条路,并告诉你我在我编写的程序中是如何实现的:

short Function() {
    short ret = 0;

    ret = FunctionA();
    if(ret != 0) {
        SomeUsefulMessageOrAssertionHere();
        return ret;
    }
    ...

实际上减少了上游错误处理代码,因为编写良好的诊断最好在调用点处理。当然,它不会改变发生错误时必须采取的行动。

答案 3 :(得分:1)

有很多方法可以重写这个,但我想不出比你更直接,更容易的事情。
这是另一种变体,专门用于最小化if ... return语句的数量。

int i;
for (i = 0; i<3; +i) {
   switch (i) {
      case 0: ret = FunctionA(); break;
      case 1: ret = FunctionB(); break;
      case 2: ret = FunctionC(); break;
   }
   if (ret != 0) return ret;
}
return 0;

答案 4 :(得分:0)

如果我没有犯错,这应该是等同的

short Function()
{
   short ret = FunctionA();   
   if(ret == 0)
   {
        ret = FunctionB();
        if(ret == 0)
        {
            ret = FunctionC();
        }

    }
   return ret;
}

答案 5 :(得分:0)

你可以写:

short ret;
if (ret = FunctionA()) return ret;
if (ret = FunctionB()) return ret;
if (ret = FunctionC()) return ret;

尽管如此,你可能会让一些同事感到惊讶!

使用短路的另一种选择,受到@Tim的帖子的启发:

short ret;
return (ret = FunctionA()) || (ret = FunctionB()) || (ret = FunctionC()) ? ret : 0;

在C ++中你可以说:

if (short ret = FunctionA()) return ret;

答案 6 :(得分:0)

short Function() {

    short temp;

    return (temp = FunctionA()) ? temp : (temp = FunctionB()) ? temp : FunctionC();

}

答案 7 :(得分:0)

我一直很喜欢功能指针,我自己。

int main()
{
    typedef ret-type (*Fptr)( ... args-types ... );

    const int N_FUNC = 3;
    Fptr functions[] = { FunctionA, FunctionB, FunctionC };

    short ret = 0;
    for( int i=0; ! ret && i < N_FUNCS; i++ )
        ret = functions[i];

    return ret;
}