首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将errno转换为退出代码

将errno转换为退出代码
EN

Stack Overflow用户
提问于 2021-01-19 14:49:33
回答 1查看 220关注 0票数 0

我正在开发使用大量文件系统功能的lib。

我想要的是,我的函数返回各种错误代码(而不仅仅是-1作为错误),这取决于errno,以防文件系统功能失败。

虽然我可以直接使用errno值,但是我想在函数、错误代码、系统errno之间创建一些抽象层(例如,我的错误值从-1000开始,是负值,而errno值是正的)。

我的问题是什么是最好的方式来实现它。

目前,我看到了两种可能的解决方案:

  1. 使用带有错误代码和开关大小写函数的枚举进行翻译,例如:

代码语言:javascript
复制
    typedef enum {
    MY_ERROR_EPERM  = -1104,  /* Operation not permitted                  */
    MY_ERROR_ENOENT = -1105,  /* No such file or directory                */
//  ...
    } MyReturnCodes_t;
int ErrnoToErrCode(unsigned int sysErrno) {
        int error = ENOSYS;
        switch(sysErrno) {
        case EPERM: error = MY_ERROR_EPERM; break;
        case ENOENT: error = MY_ERROR_ENOENT; break;
//      ...
        }
        return error;
}

enum

  1. 直接使用翻译

代码语言:javascript
复制
#define ERR_OFFSET -1000
typedef enum {
    MY_ERROR_EPERM  = ERR_OFFSET - EPERM,   /* Operation not permitted   */
    MY_ERROR_ENOENT = ERR_OFFSET - ENOENT,  /* No such file or directory */
    MY_ERROR_ESRCH  = ERR_OFFSET - ESRCH,   /* No such process           */
 //  ...
} MyReturnCodes_t;

哪条路更恒定?

还有一点:这个库应该同时在QNXLinux OS上使用,什么是正确的方法来对errno代码(在某些情况下是不同的)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-19 15:16:25

我会在一个专用函数中选择一个std::map。只要使用提供的错误宏,您就不必关心空白或任何事情:

代码语言:javascript
复制
#include <iostream>
#include <errno.h>
#include <map>

namespace MyError
{
    
enum MyReturnCode: int 
{
    MY_INVALID_VAL  = 0    ,  /* Invalid Mapping                          */
    MY_ERROR_EPERM  = -1104,  /* Operation not permitted                  */
    MY_ERROR_ENOENT = -1105,  /* No such file or directory                */
};

MyReturnCode fromErrno(int e)
{
    static const std::map<int, MyReturnCode> mapping {
        { EPERM, MY_ERROR_EPERM},
        { ENOENT, MY_ERROR_ENOENT}
    };
    
    if(mapping.count(e))
        return mapping.at(e);
    else
        return MY_INVALID_VAL;
}

}

int main()
{
    std::cout << MyError::fromErrno(ENOENT) << std::endl;
    std::cout << MyError::fromErrno(42) << std::endl;

    return 0;
}

http://coliru.stacked-crooked.com/a/1da9fd44d88fb097

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65793885

复制
相关文章

相似问题

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