首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用函数之前需要清除errno,然后检查errno?

在调用函数之前需要清除errno,然后检查errno?
EN

Stack Overflow用户
提问于 2014-08-14 18:32:27
回答 3查看 15.1K关注 0票数 3
  1. 在调用函数之前,我们需要将errno重置为零吗?见下面的代码。现在,场景是a_dest_path是一个现有的目录。但是,当我执行代码时,它总是尝试mkdir,但返回错误时表示目录无法创建,因为它存在。在GDB中,我在调用errno之前检查opendir()errno是2,而且在调用opendir()时,errno似乎没有设置为零。那么,在调用errno之前,需要将opendir()重置为零吗?
  2. errno可能在system()调用中被更改,然后在我的else if分支中,我检查来自system()的结果,而不是opendir()。因此,在opendir()之后,是否需要将errno赋值给一个变量,然后在if..elseif..else分支中检查这个变量?
代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-14 18:41:26

不,在调用函数之前不需要重置errno,因为合同上写着

opendir()fdopendir()函数返回指向目录流的指针。如果出现错误,则返回NULL,并适当设置errno

测试返回值,并且只在您实际有错误时查看errno

(realloc是一个罕见的函数示例,在特定情况下,如果不查看errno,就无法将错误与成功区分开来,但如果这是消除歧义所必需的,它将清除错误。)

票数 8
EN

Stack Overflow用户

发布于 2014-08-14 18:55:22

只有在真正的错误发生后,errno才有意义。您必须先检查错误条件,然后查看errno,例如:

代码语言:javascript
复制
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...
    }
}
票数 4
EN

Stack Overflow用户

发布于 2021-08-01 23:00:03

在您的示例中,正如其他人所述,没有必要重置errno

但是,只有极少数函数返回一个数字,对于它们来说,没有一个数字可以100%表示发生的错误。在这几种情况下,重新设置errno是必要的。

这样一个函数的一个例子是strtol()。如果出错,它会返回-1。如果您真的想知道用户是否通过了"-1",或者是否发生了错误,那么您希望这样做:

代码语言:javascript
复制
errno = 0;
long r = strtol(input, &end, 10);
if(r == -1 && errno != 0)
    ...handle the error...

在大多数情况下,这类函数确实在其DESCRIPTIONRETURN VALUE手册部分详细说明了问题。

正如其他人所提到的,一个函数返回一个指针,当它返回一个nullptr时,它表示一个错误,那么您不需要重置errno,因为只有当函数返回nullptr时,才应该检查该变量。

代码语言:javascript
复制
ptr = malloc(123);
if(ptr == nullptr)
   ...handle error, 'errno' may give you extra hints about error...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25315191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档