【问题标题】:C Checking for NULL & Error HandlingC 检查 NULL 和错误处理
【发布时间】:2013-09-21 07:51:03
【问题描述】:

我有对字符串执行操作的函数。例如,String *concat(s1, s2); 会变成 s1+s2 并返回一个新字符串。

我想其他用户可以向我发送 NULL 参数。 我可以检查 NULL。

if(s1 == NULL || s2 == NULL)
  return NULL;

然后返回 NULL。

或者我可以让整个程序退出:

exit(EXIT_FAILURE);

我认为解决问题的最佳方法是退出函数并且不返回任何内容。但是,如果我的用户期待 String 而我只是返回,他不会崩溃和烧毁吗?我也觉得打印给用户是个坏主意。

我很想找到一种方法来退出该函数并在任何情况下允许程序继续执行。

【问题讨论】:

  • 组合两个NULL 字符串会产生另一个NULL 字符串,所以有什么困惑。 被调用者有责任清理输入。您需要确保不会因输入无效而崩溃。
  • 或者,您需要确保您确实因无效输入而崩溃 - 记录界面并声明它是受尊重的。快速失败也是一个好策略。

标签: c error-handling


【解决方案1】:

由于 C 没有异常,您必须在返回值中指示错误条件。虽然在这种情况下为无效输入返回 NULL 听起来是一个不错的选择,但您可以更改设计,以便可以返回错误代码和连接的字符串:使函数接受三个参数,其中一个是输出参数。

int concat(string s1, string s2, string *out)

如果有错误,该函数将返回错误代码,否则将结果写入 out 参数。

【讨论】:

  • 可能有点夸大其词?任何有脑子去检查一个 concat 函数的返回码的人,大概都能够确保在函数不处理它的情况下不传递 null!
  • @Joni C 有一个伪异常机制:setjmp() 和 longjmp()。
  • @0xBAADF00D: 你打算在strcat 克隆中使用longjmp
  • @Nicholas,我以 concat 函数为例来演示一种可以更普遍应用的技术。
  • @n.m 你可以重新创建一个 strcat 克隆,但它太复杂了,在这种情况下,简单地返回 NULL 是给定参数之一是 NULL 就足够了
【解决方案2】:

这取决于是否(按设计)允许 NULL 输入值。如果是,您可以:

  • 返回 NULL(如果允许返回值 - 可能是,因为您假设它是允许的输入值)
  • 通过返回状态码或使用某种errno 值来表示一些错误情况

如果 NULL 是无效值,则传递 NULL 是程序员的错误,因此必须由函数的调用者进行检查。您可以使用前两种方法,还可以:

  • 利用“未定义的行为”,任何事情都可能发生。使用断言可能是最好的方法:

    #include <assert.h>
    
    assert (str1 != NULL && str2 != NULL);
    

使用断言的优势在于,在发布版本中,您可以关闭检查,因此不会有任何性能损失。

现在是重要的部分:无论你走哪条路,都要清楚地记录并坚持下去。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多