在我的一个大学项目中,我得到了积分,我的教授反馈说我没有处理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
的返回类型。
那么什么时候应该检查返回值,以及如何处理它?</ p>
答案 0 :(得分:15)
一般来说,您应该始终检查函数的返回值是否有错误。
然而,在printf
的情况下,在大多数情况下这样做几乎没有用处。正如您所提到的,如果确实失败了,您可以使用fprintf
打印到stderr
,但这会引发 检查错误的问题。
如果您没有重定向或重新开启stderr
,您可能会遇到同样的问题,在这种情况下它可能并不重要,但如果stderr
指向其他地方然后在那里写作可能有价值。您也可以退出流程,但需要确定是否有意义。
您可能想要检查返回值的一个值得注意的时间是,如果要跟踪为了格式化目的而打印的字符数。我在写入日志文件以确定何时滚动日志时使用fprintf
完成此操作,但由于printf
通常写入交互式控制台(如果它未到期)重定向,你不会知道它,这不会真正适用。
至于你的教授,我唯一的猜测是他希望你养成检查错误的习惯。这是一件好事,但是大多数规则都有例外,这就是其中之一。
答案 1 :(得分:11)
为清楚起见 - printf()
返回...
printf
函数返回传输的字符数,如果发生输出或编码错误则返回负值。 C11§7.21.6.33
检查printf()
的返回值为负值pedantic,通常不需要。可以考虑以下情况:
环境限制。
printf()
"%s"
printf()
可能超出环境限制,导致fprintf(stderr, ...
返回负值。这并不意味着stdout
上的后续消息也必须失败。
任何单次转换可以产生的字符数至少为4095.C11§7.21.6.115
输出设备较弱。
知道stdout
经常在需要检测输出故障的通信接口上重定向的情况。即使屏幕输出取得了非常高的成功,但对于串行(rs232)等各种其他输出流而言并非如此。在这种情况下,stderr
和stderr
可能会以不同方式重定向,因此var app = angular
.module('app', ['firebase'])
app.factory("Auth", ["$firebaseAuth",
function($firebaseAuth) {
return $firebaseAuth();
}
]);
app.controller("SampleCtrl", ["$scope", "Auth",
function($scope, Auth) {
$scope.createUser = function() {
$scope.message = "One or more field is not correctly entered !";
$scope.error = null;
// Create a new user
Auth.$createUserWithEmailAndPassword($scope.email, $scope.password)
.then(function(firebaseUser) {
$scope.message = "User created with email: " + $scope.email + " and ID " + firebaseUser.uid;
}).catch(function(error) {
$scope.error = error;
});
};
$scope.deleteUser = function() {
$scope.message = null;
$scope.error = null;
Auth.$deleteUser().then(function() {
$scope.message = "User deleted";
}).catch(function(error) {
$scope.error = error;
});
};
}
]);
可能仍然可靠。
在任何情况下,如果教授在曲线上评分,可能很多人都会产生相同的负值 - 所以没有年级差异。使用有奇怪要求和期望的客户。
答案 2 :(得分:3)
不检查返回值被视为不良做法。但是如果你通过在函数调用的前面添加(void)
来明确表明你忽略了返回值,那么它被认为是干净的:
(void) printf(...);
这表明,您知道有返回值,但您有意忽略它。
答案 3 :(得分:2)
Unix的哲学是stdout
(虽然不一定是stderr
)应该是可以进一步处理的。编译器和生成器将其用于代码输出。
stdout
应该是您的流程产品所在的位置。如果该产品被缩短,您的流程不应该返回EXIT_SUCCESS
。
我说要检查这些写入stdout
。
stderr
或多或少是为了方便。如果您正在使用它,那么您可能已经处于错误状态,如果您的错误报告失败,则不会你可以做多少(尽管你仍然应该用返回码发出错误信号)。)
答案 4 :(得分:0)
没有。在现实世界中,与文化 mit einemRuffürPedanterie中的学术练习相反,检查printf()
或close()
的返回值并不重要,或者其他一些事情。如果没有合理的方法对某条信息采取行动,为什么还要费心收集呢?
答案 5 :(得分:0)
如果您正在编写一个使用JSON的应用程序(例如:从数据库读取数据,将数据导出到stdout
中),则程序的调用者可能会将输出重定向到文件中。在这种情况下-磁盘可能已满。
问题: 谁会抱怨磁盘已满:shell或您的程序?