[英]Is checking the return value of printf important?
在我的一个大学项目中,我从教授那里得到了分数和反馈,说我没有处理printf
错误。
英文--> / * ### FB: Error handling printf () is missing * /
/* ### FB: Fehlerbehandlung printf() fehlt */
printf("%7lu %8lld %10s %3lu %-8s %-8s %8lu %12s %s %s %s\n",
sb->st_ino, nblks, permstr, (unsigned long) sb->st_nlink,
username, groupname, sb->st_size,
ntime, filename, (symlink ? "->" : ""),
(symlink ? symlink : "")
);
我的问题是,始终检查printf
函数的返回值并处理错误真的很重要吗? 即使我发现错误,我仍然会使用fprintf
打印到stderr
,为此我必须再次检查fprintf
的返回类型。
那么什么时候应该检查返回值,又应该如何处理呢?
一般来说,您应该始终检查函数的返回值是否有错误。
然而,在printf
的情况下,在大多数情况下这样做几乎没有用。 正如你提到的,如果它失败,你可以使用fprintf
打印到stderr
,但那么加薪的应该是对错误进行检查的问题。
如果您不重定向或重新打开stderr
您可能会遇到同样的问题,在这种情况下,这可能无关紧要,但如果stderr
指向其他地方,则在那里写入可能有价值。 您也可以退出该过程,但您需要确定这样做是否有意义。
您可能想要检查返回值的一个值得注意的时间是,您是否想要跟踪出于格式化目的而打印的字符数。 我在写入日志文件以确定何时滚动日志时使用fprintf
完成了此操作,但是由于printf
通常写入交互式控制台(如果不是由于重定向,您将不会知道),那不会真的适用。
至于你的教授,我唯一的猜测是他想让你养成检查错误的习惯。 这是一件好事,但是像大多数规则一样,也有例外,这就是其中之一。
为清楚起见 - printf()
返回 ...
printf
函数返回传输的字符数,如果发生输出或编码错误,则返回负值。 C11 §7.21.6.3 3
检查printf()
的返回值是否为负值是迂腐的,通常不需要。 可以考虑以下几种情况:
环境限制。
带有"%s"
的单个printf()
可能会超出环境限制并导致printf()
返回负值。 这并不意味着fprintf(stderr, ...
上的后续消息也必须失败。
任何单个转换可以产生的字符数至少应为 4095。 C11 §7.21.6.1 15
弱输出设备。
已知stdout
通常通过需要检测输出故障的通信接口重定向的情况。 尽管屏幕输出非常成功,但对于串行(rs232)等各种其他输出流而言,情况并非如此。 在这种情况下, stdout
和stderr
可能会以不同的方式stderr
,因此stderr
可能保持可靠。
在任何情况下,如果教授在曲线上打分,很可能很多人都得到了相同的负分——所以没有成绩差异。 习惯于有奇怪要求和期望的客户。
不检查返回值被认为是不好的做法。 但它被认为是干净的,如果你明确声明你通过在函数调用前添加(void)
来忽略返回值:
(void) printf(...);
这表明,您知道有返回值,但您故意忽略它。
Unix 哲学是stdout
(虽然不一定是stderr
)应该可以进一步处理。 编译器和生成器将它用于代码输出。 stdout
应该是您的流程产品所在的位置。 如果该产品被缩短,您的流程不应返回EXIT_SUCCESS
。 我说一定要检查那些对stdout
写入。
(另一方面, stderr
或多或少是为了方便起见。如果您正在使用它,那么无论如何您可能已经处于错误状态,并且如果您的错误报告失败,则您无能为力(尽管您仍应使用返回码发出错误信号)。)
不。在现实世界中,与文化mit einem Ruf für Pedanterie 中的学术练习相反,检查printf()
或close()
或其他很多东西的返回值并不重要。 如果没有合理的方法来处理一条信息,为什么还要收集它呢?
如果您正在编写一个输出 JSON 的应用程序(例如:从 DB 读取数据,将数据导出到stdout
),您的程序调用者可能会将输出重定向到一个文件中。 在这种情况下 - 磁盘可能会被填满。
问题:谁会抱怨磁盘已满:shell 还是您的程序?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.