• C++错误处理漫谈


    C++自学精简教程 目录(必读)

    程序必须要能面对错误情况给出反应

    一、系统错误

    考虑你写了一求数两个整数最大公约数的函数int gcd(int a, int b);

    其中a和b都不可以为0

    二、处理方法

    函数一开始就判断a,b两个是否有0出现

    你的代码开始的地方变成了下面的样子

    1. int gcd(int a, int b)
    2. {
    3. //(1)使用断言
    4. assert(a!= 0 && b!=0);
    5. // 这里开始干正事
    6. }

    上面代码使用断言的效果:debug开发模式这里会导致程序死掉。

    不过断言只有debug模式才有(release模式会被编译器擦除,写了也等于没写)。

    代码的参数者约定原则
    gcd代码的作者assert保证返回值,方便调用;
    底层保证效率
    gcd代码的用户调试环境使用发现错误自己保证别传错误参数

    二、逻辑错误

    考虑你实现了一个json库,用户给你一个字符串,你的json对象就可以根据这个json字符串创建对象,并访问其中的数据:

    1. CJsonObject json;
    2. json.CreateFromStr("{\"name\":\"zhangsan\", \"age\":26\"}");//bad json str

    上面的json对象需要一个合法的json字符串才能创建,但是传入的字符在整数26右侧多了一个分号。

    这是一个非法的字符串,这时候你作为库作者不知道应该怎么处理。你唯一能做的就是把错误暴露出来。

    三、两种暴露错误的方式

    1 返回错误码

    函数返回错误码,调用函数的人检查错误码。代码变成下面这样:

    1. CJsonObject json;
    2. int good_json = json.CreateFromStr("{\"name\":\"zhangsan\", \"age\":26\"}");//bad json str
    3. if(good_json != OK)
    4. {
    5. //write log or print some worning to the caller
    6. return ERROR_JSON;//so many error code
    7. }
    代码参与者约定原则
    CreateFromStr的作者负责抛出错误,而不处理错误库作者不知道该如何处理错误
    CreateFromStr的用户负责发现错误,进而处理错误上层代码保证有效性

    2 抛出异常

    抛出异常之后,库作者需要捕获异常才知道有没有发生错误。代码变成下面这样:

    1. CJsonObject json;
    2. try
    3. {
    4. json.CreateFromStr("{\"name\":\"zhangsan\", \"age\":26\"}");//bad json str
    5. }
    6. catch(exception e)
    7. {
    8. //错误处理, write log or print some worning to the caller
    9. }
    代码参与者约定原则
    CreateFromStr的作者负责抛出错误,而不处理错误库作者不知道该如何处理错误
    CreateFromStr的用户负责发现错误,进而处理错误上层代码保证有效性

    3 返回错误码和抛异常的对比

    类型返回错误码抛异常
    常用场景操作系统json库等中间库
    优点流程完全可控,对于流程比较复杂的场景可以准确定位每一步,并做出处理代码直观,不用每次都判断
    缺点导出都是判断错误的代码,代码增长比较严重流程复杂的时候,没有合适的地方捕获,提前捕获用户看不到;适合层级比较少的场景
  • 相关阅读:
    如何做好漏洞扫描工作提高网络安全
    关于 css 伪元素 content属性值 为中文字符时出现乱码问题的处理
    PostgreSQL数据库中实现字段递增
    775. 全局倒置与局部倒置
    实验四 图像增强—灰度变换之直方图变换
    【ROS】机械人开发四--ROS常用概念与Launch文件
    深度学习训练时冻结部分参数的方法
    机器学习(五)逻辑回归
    代码随想录算法训练营第21天|530.二叉搜索树的最小绝对差 |501.二叉搜索树中的众数 | 236. 二叉树的最近公共祖先
    关于四元数与欧拉角协方差阵转换的一些思考
  • 原文地址:https://blog.csdn.net/ClamReason/article/details/126686873