代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  5
  • Tom  · 技术社区  · 15 年前

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

    我正在编写一个简单的程序,它有一些类似的函数。

    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 回复  |  直到 15 年前
        1
  •  6
  •   bdhar    15 年前

    我猜你的 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参数的当前状态。请参阅Jamesdlin的评论!

        2
  •  2
  •   Alexander Rafferty    15 年前

    如果函数不返回-1,则返回-1。但是如果传递n=0不会破坏函数,那么就不需要这样做。我假设n是数组m的大小。

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

        3
  •  1
  •   caf    15 年前

    如果需要,可以使用特殊的浮点值-例如,如果浮点实现支持安静的NaN(非数字),则可以使用 NAN 宏从 math.h :

    #include <math.h>
    float foo(float *m,size_t n)
    {
         if (n == 0) return NAN;
    
         ...
    }
    
        4
  •  1
  •   jamesdlin    15 年前

    通过清晰地记录代码,您应该让调用者知道您的函数的语义是什么。

    你的职责是什么?如果要求呼叫者不传递0 n ,然后需要解释,函数应该使用 assert 验证是否满足这些要求。 逻辑错误 应该及早发现,并且这些故障应该尽可能引人注目。

    现在,如果您正在为一个库编写代码,这个库将被其他开发人员使用,并且担心人们将使用 断言 禁用,然后将其与始终启用的较软故障模式结合起来是合理的:

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