下面是简单的C代码片段:
#include <stdio.h>
int main(void) {
FILE *fd = fopen("nothing", "r");
// perror("fopen");
return 0;
}
不打印任何内容,但如果不注释perror("fopen")
,则打印
fopen: No such file or directory
根据perror
的手册页
[当系统调用失败时,通常返回-1并设置变量errno值描述出了什么问题。
并且No such file or directory
对应于errno = 2
因为stderr
是未缓冲的,所以似乎仅当调用perror
时,才会将错误消息写入stderr
,为什么c程序隐式忽略该错误(errno
修改了),而不是立即将其写入到stderr
?
其他问题...还有其他方法可以触发stderr
的书写吗?我们是否总是需要“手动”触发它,还是在某些情况下c程序可以像Java抛出运行时异常一样“自动”使其触发?
系统和/或库调用在出现错误时不会自动打印消息。这取决于您。这些函数将执行的操作是返回特定值以指示错误,并设置errno
指示特定错误。然后,您可以使用perror
打印与errno
当前值相对应的错误字符串。
[在fopen
的情况下,如果呼叫失败,则返回NULL
。因此,您需要检查是否这样做,如果是,请使用perror
打印消息。
FILE *fd = fopen("nothing", "r");
if (fd == NULL) {
perror("fopen failed");
}
以这种方式执行操作可以使您更好地控制程序。例如,在某些情况下,您可能希望文件not存在,因此,无法打开文件不是错误,因此在这种情况下,您不想打印错误。