C:参数检查时抛出错误还是让它击中风扇?

时间:2010-09-07 04:15:16

标签: c error-checking sanity-check

我有一个简单的设计(?)问题。

我正在编写一个简单的程序,它有几个看起来像这样的函数。

float foo (float* m,size_t n){

   float result;
   //do some calculations, for example a sum 


   return result / n;
}

我对此有几个问题,无意重新开启一些圣战。

我应该在n上添加健全性检查吗?如果是这样,我应该如何让来电者知道?

返回-1在浮动上看起来很奇怪;

float foo(float *m,size_t n){
     if (n == 0) return -1f

     ...
  }

我的另一个选择是out参数

float foo(float *m,size_t n, int *error){

        if (n==0){
           *error = 1;
            return 0f;
        }
       ...
}

更新

这是一种玩具程序,只是想尝试一些东西。问题超出了这个事实。也许我应该改写为“如何在没有(OOP)异常的情况下处理错误”。

还要考虑在拨打电话前测试n,但不要那么喜欢。

有什么想法? 提前谢谢。

4 个答案:

答案 0 :(得分:6)

我猜你的out parameter选项很好。但我想其他方式会更好。使用out参数获取结果,使用返回值表示调用的状态。喜欢这个

int foo(float *m, size_t n, float* result)
{
  if(someFailureCondition)
    return ERROR; // ERROR being an error integer
  // else
  // do some calculation
  // set your result
  return NO_ERROR; // NO_ERROR being an integer
}

修改 返回值可以更详细,以表示out参数的当前状态。见詹姆斯林的评论!

答案 1 :(得分:2)

如果函数无法返回-1,则无论如何都返回-1。但是如果传递n = 0不会破坏函数,那么它实际上并不需要。我假设n是数组m的大小。

处理错误是一个优先事项。当函数失败时,OpenGL通过返回错误代码(-1或其他)来处理错误。通过调用GetLastError()(或类似的东西)返回错误代码。这似乎是一种理想的错误处理解决方案。

答案 2 :(得分:1)

如果需要,可以使用特殊的浮点值 - 例如,如果浮点实现支持安静的NaN(非数字),那么您可以使用{{1}中的NAN宏}}:

math.h

答案 3 :(得分:1)

您应该通过清楚地记录您的代码,让调用者了解您的函数的语义。

你的职能合同是什么?如果要求调用者不为n传递0,则需要解释,并且该函数应使用assert来验证是否满足这些要求。应该尽早发现逻辑错误,并且这些失败应该尽可能地引人注目。

现在,如果您正在编写将由其他开发人员使用的库的代码,并且担心人们将在禁用assert的情况下进行编译,那么将其与始终启用的更软故障模式相结合是合理的。 :

if (n == 0)
{
    assert(0);
    return NAN; /* Or return some error code */
}