errno重置为零吗?见下面的代码。现在,场景是a_dest_path是一个现有的目录。但是,当我执行代码时,它总是尝试mkdir,但返回错误时表示目录无法创建,因为它存在。在GDB中,我在调用errno之前检查opendir(),errno是2,而且在调用opendir()时,errno似乎没有设置为零。那么,在调用errno之前,需要将opendir()重置为零吗?errno可能在system()调用中被更改,然后在我的else if分支中,我检查来自system()的结果,而不是opendir()。因此,在opendir()之后,是否需要将errno赋值给一个变量,然后在if..elseif..else分支中检查这个变量?DIR *dp = opendir(a_dest_path.c_str());
if (errno == ENOENT) {
string mkdir_comman = "mkdir " + a_dest_path;
system(mkdir_command.c_str());
} else if (errno == ENOTDIR) {
printf("Destination %s exists but is not directory\n", a_dest_path.c_str());
return k_error_not_directory;
} else if (errno == 0) {
closedir(dp);
}发布于 2014-08-14 18:41:26
不,在调用函数之前不需要重置errno,因为合同上写着
opendir()和fdopendir()函数返回指向目录流的指针。如果出现错误,则返回NULL,并适当设置errno。
测试返回值,并且只在您实际有错误时查看errno!
(realloc是一个罕见的函数示例,在特定情况下,如果不查看errno,就无法将错误与成功区分开来,但如果这是消除歧义所必需的,它将清除错误。)
发布于 2014-08-14 18:55:22
只有在真正的错误发生后,errno才有意义。您必须先检查错误条件,然后查看errno,例如:
DIR *dp = opendir(a_dest_path.c_str());
if (dp) {
closedir(dp);
} else {
if (errno == ENOENT) {
string mkdir_comman = "mkdir " + a_dest_path;
system(mkdir_command.c_str());
} else if (errno == ENOTDIR) {
printf("Destination %s exists but is not directory\n", a_dest_path.c_str());
return k_error_not_directory;
} else {
// some other error...
}
}发布于 2021-08-01 23:00:03
在您的示例中,正如其他人所述,没有必要重置errno。
但是,只有极少数函数返回一个数字,对于它们来说,没有一个数字可以100%表示发生的错误。在这几种情况下,重新设置errno是必要的。
这样一个函数的一个例子是strtol()。如果出错,它会返回-1。如果您真的想知道用户是否通过了"-1",或者是否发生了错误,那么您希望这样做:
errno = 0;
long r = strtol(input, &end, 10);
if(r == -1 && errno != 0)
...handle the error...在大多数情况下,这类函数确实在其DESCRIPTION或RETURN VALUE手册部分详细说明了问题。
正如其他人所提到的,一个函数返回一个指针,当它返回一个nullptr时,它表示一个错误,那么您不需要重置errno,因为只有当函数返回nullptr时,才应该检查该变量。
ptr = malloc(123);
if(ptr == nullptr)
...handle error, 'errno' may give you extra hints about error...https://stackoverflow.com/questions/25315191
复制相似问题