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

  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;
    }

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

posted @   IpnAh  阅读(95)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示