• boost之跨平台 错误处理


    system

    C++中处理错误的最佳方式是使用异常,但操作系统和许多底层AP工不具有这个能力,它们一般使用更通用也更难以操作的错误代码来表示出错的原因,不同的操作系统的错误代码通常不是兼容的,这给编写跨平台的程序带来了很大的麻烦。

    system库使用轻量级的对象封装了操作系统底层的错误代码和错误信息,使调用操作系统功能的程序可以被很容易地移植到其他操作系统。它作为基础部件被chronovfilesystem和 asio等库调用,并且被接受为c++标准(C++11.19.5)。

    jamfile 指定 lib 

    lib boost_system;

    system 库位于名字空间boost : :system,需要包含头文件(注意与C++标准的名字不同),即:
    #define BOOST_ERROR_CODE_HEADER_ONLY      //无需编译即可使用system库
    #include
    using namespace boost: :system;
     

    错误值

    system库在名字空间boost : :system: :errc下定义了一个很大的枚举类errc_t它定义了通用的可移植的错误代码,我们应当尽量使用它来标记错误原因:

    1. namespace errc
    2. {
    3. enum errc{
    4. success=0,
    5. address_family_not_supported,
    6. address_in_use,
    7. address_not_available,
    8. already_connected,
    9. ...
    10. }
    11. }

    system库还在头文件里分别定义了Linux和windows操作系统特定的错误值枚举,分别位于名字空间boost::system : : linux_error和 boost ::system : : windows_error。如果针对这两个操作系统做特定编程,则可以包含这两个头文件。

    错误类别

    system库的核心类是error_category、error_code和error_condition。

    error category是一个抽象基类,用于标识错误代码的类别,它的类摘要如下:

    1. class error_category:public noncopyable
    2. {
    3. public:
    4. virtual const char* name() const BOOST_SYSTEM_NOEXCEPT=0;
    5. virtual string message(error_code::value_type ev)const =0;
    6. virtual error_condition default_error_condition(int ev)const;
    7. virtual bool equiavlent(int code,const error_condition&condition);
    8. virtual bool equiavlent(const error_code&code,int condition);
    9. }

    成员函数name( )可以获得类别的名称;

    message()可以获得错误代码ev对应的描述信息;

    default_error_condition ()是一个工厂方法,它由错误代码 ev产生一个error_condition对象;

    equivalent()用于比较两个错误代码是否相等。

    error_category 不能直接使用,必须使用继承的方式生成它的子类。system库在匿名名字空间里预定义了两个子类system_error_category和generic_error_category,用于表示系统错误和通用的可移植错误,可以用位于名字空间boost ::system的自由函数system_category()和 generic_category ()间接访问。

    1. class my_category:public error_category
    2. {
    3. public:
    4. virtual const char* name()const BOOST_SYSTEM_NOEXCEPT
    5. {return "myapp_category";}
    6. virtual std::string message(int ev)const{
    7. std::string msg;
    8. switch (ev)
    9. {
    10. case 0:
    11. msg="ok"/* constant-expression */:
    12. /* code */
    13. break;
    14. default:
    15. msg="some error";
    16. break;
    17. }
    18. return msg;
    19. }
    20. };

    错误代码

    error_code和 error_condition都用于表示错误代码,但error_code更接近操作系统和底层API,而error_condition则更偏重于可移植。两者的声明很类似,但error_code 多了一个 default_error_condition ()的方法,可以把 error_code 转换成error_condition。

    1. class error_code
    2. {
    3. public:
    4. error_code();
    5. error_code(int val,const error_category&cat);
    6. void assign(int val,const error_category& cat);
    7. void clear();
    8. int value() const;
    9. const error_category&category()const;
    10. error_condition default_error_condition()const;
    11. std::string message()const;
    12. ...
    13. };

    error_code和 error_condition都可以从一个整数错误值或者errc_t枚举构造,并同时指定所属的错误类别。如果无参构造,那么错误值将会是0(无错误)。

    error_code对象内部的值可以用value ()获得,获得错误描述要使用message ( ) ,它将调用error_category的message ()返回描述信息。函数category ()可以返回错误代码所属的类别,因此message ()相当于:

    ec.category().message(ec.value)

    不同的错误类别决定了error_code 的含义,相同的错误代码如果属于不同的类别,那么将具有不同的含义。

    1. void error_category1()
    2. {
    3. my_category my_cat;
    4. error_code ec(10,my_cat);
    5. std::cout<value()<message()<
    6. ec=error_code(10,system_category());
    7. std::cout<value()<message()<
    8. }
    9. //
    10. 10 some error
    11. 10 No child processes

    错误异常

    system库还提供一个异常类system_error,它是 std: :runtime_error的子类,是对error_code的一个适配,可以把error_code应用到C++的异常处理机制之中。

    system_error位于名字空间boost : : system,使用时需要另外包含头文件,即;

    #include

    using namespace boost: :system;

    示范用法:

    1. try{
    2. throw system_error(
    3. error_code(5,system_category()));
    4. }
    5. catch(system_error&e)
    6. {
    7. cout<what()
    8. }

  • 相关阅读:
    【HuggingFace轻松上手】基于Wikipedia的知识增强预训练
    【Linux】自动化构建工具 —— make/makefile&&Linux第一个小程序 - 进度条
    持续集成Jenkins安装部署
    uniapp 单选框以及多选框样式更改
    Java之接口
    springboot森林生物调查系统的设计与实现毕业设计源码301826
    lwIP - A Lightweight TCP/IP stack
    GitHub平台 Bookget操作
    Nginx源码解析--configure
    数据结构 - 线性表(顺序表)
  • 原文地址:https://blog.csdn.net/qq_62309585/article/details/126904055