我们应该错误地检查C中的每个呼叫吗?

时间:2018-01-14 03:21:57

标签: c error-handling

当我们编写C程序时,我们调用malloc或printf。但我们需要检查每一个电话吗?您使用什么指南?

e.g。

char error_msg[BUFFER_SIZE];
if (fclose(file) == EOF) {
    sprintf(error_msg, "Error closing %s\n", filename);
    perror(error_msg);
}

3 个答案:

答案 0 :(得分:1)

你的问题的答案是:“做你想做的事”,没有书面规则,但正确的问题是“用户在失败的情况下想要什么”。

让我解释一下,如果你是一名学生写一个测试程序,例如,没有绝对需要检查错误:这可能是浪费时间。

现在,如果您的代码可能被其他人分发或使用,那就完全不同了:让自己置身于未来用户的手中。当应用程序出现问题时,您更喜欢哪条消息:

Core was generated by `./cut --output-d=: -b1,1234567890- /dev/fd/63'.
Program terminated with signal SIGSEGV, Segmentation fault.

MySuperApp failed to start MySuperModule because there is not enough space on the disk.
Try to free space on disk, then relaunch the app. 
If this error persists contact us at support@mysuperapp.com

正如评论中已经解决的那样,您必须考虑两种类型的错误:

  • 致命错误是一个杀死你的程序(app / server / site /无论是什么)的错误。它使它无法使用,无论是通过崩溃还是将其置于某种状态,即它无法完成它的可用工作。例如内存分配,磁盘空间......
  • 非致命错误是令人烦恼的事情,但程序可以继续做它应该做的事情。例如找不到文件,为其他用户提供不请求调用错误的内容。

来源:https://www.quora.com/What-is-the-difference-between-an-error-and-a-fatal-error

答案 1 :(得分:0)

如果检测到错误,您的程序行为是否必须以不同的方式运行,请执行错误检查。让我用一个例子来说明这一点:假设您在程序中使用了一个临时文件,并使用unlink(2)系统调用在程序结束时擦除该临时文件。您是否要检查文件是否已成功删除?让我们用一些常识来分析问题:如果你检查错误,你是否能够(在程序内部)做一些替代的事情来应对这个问题?这种情况并不常见(如果您创建了该文件,那么您将无法删除该文件,但是在两者之间可能会发生某些事情 - 例如,禁止您写入的目录权限更改目录了)但是在那种情况下你能做什么?在这种情况下,是否可以使用不同的方法来擦除临时文件。可能不是......所以检查(在这种情况下)来自unlink(2)系统调用的可能错误几乎是无用的。

当然,这并不总是适用,你必须在编程时使用常识。应始终考虑写入文件的错误,因为它们属于访问权限或主要属于完整文件系统(在这种情况下,即使尝试生成日志消息也可能是用途,因为您已填满磁盘 - 或者不是,如果可以忽略完整的文件系统错误,您是否始终知道精确的环境细节可以避免。假设您必须连接到程序中的服务器。是否应对connect(2)系统调用失败采取行动?可能大多数时候,至少必须向用户提供有关协议错误(或失败原因)的用户消息....假设一切正常可以节省您在原型中的时间,但是你有在生产计划中应对可能发生的事情。

答案 2 :(得分:0)

当我想使用函数的返回值比建议使用它之前检查返回值 例如,指针返回地址也可以为null。因此建议在使用之前保持空值检查。