ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[C/C++] 几种错误处理的方式

2021-11-09 22:33:57  阅读:129  来源: 互联网

标签:__ do ... C++ 几种 try error scope 错误处理


  1. goto 跳转集中处理

    int func()
    {
        if(!try_do_a()) goto END_FUNC;
        if(!try_do_b()) goto END_FUNC;
        // ...
        return 0;
    END_FUNC:
        // do something
    }
    
  2. do{...}while(0) (原理同上, 其实就是 goto 的另一种形式)

    int func()
    {
        int r = 0;
        do
        {
            if(!try_do_a()) { r = ...; break; }
            if(!try_do_b()) { r = ...; break; }
            // ...
        }while(0);
        if(r != 0)
        {
            // do something
        }
        else return 0;
    }
    

    1. & 2. 适用于大部分错误, 可以告知调用者具体错误.

  3. 利用 throwtry{...}catch(...){...}

    int func()
    {
        if(!try_do_a()) throw some_error_data;
        if(!try_do_b()) throw some_error_data;
        // ...
        return 0;
    }
    int caller()
    {
        try
        {
            func();
        }
        catch(error_data_type& e)
        {
            // do something
        }
    }
    

    适用于出现重大且不可恢复的错误.

  4. 利用 C++ RAII 机制在变量析构时处理 (在 C++11 之后配合 lambda 更加方便)

    class __scope_error
    {
    public:
        explicit __scope_error(std::function<void()> in_on_exit)
            : m_on_exit(in_on_exit), m_is_noerror(false) {}
        ~__scope_error() { if (!m_is_noerror) m_on_exit(); }
    
        __scope_error(const __scope_error&) = delete;
        __scope_error& operator=(const __scope_error&) = delete;
    
        void ok() { m_is_noerror = true; }
    private:
        std::function<void()> m_on_exit;
        bool m_is_noerror;
    };
    
    int func()
    {
        __scope_error se(a_func);
        if(!try_do_a()) return -1;
        if(!try_do_b()) return -1;
        // ...
        se.ok();
        return 0;
    }
    

    适用于绝大多数错误, 推荐使用.

标签:__,do,...,C++,几种,try,error,scope,错误处理
来源: https://www.cnblogs.com/ipnah/p/15531249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有