打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
UC头条:[C ]异常,你了解了吗?
userphoto

2023.06.29 山西

关注

随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。

这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。

这就有了用子类抛异常,父类来捕获异常。什么意思呢?来看例子:

点击加载图片

//规定一个异常的标准类classException{public:Exception(conststring&errmsg,intid):_errmsg(errmsg),_id(id){}virtualstringwhatconst{return_errmsg;}protected:string_errmsg;int_id;};//我么们可以通过继承父类后,增加子类的成员变量来区分异常类型classSqlException:publicException{public:SqlException(conststring&errmsg,intid,conststring&sql):Exception(errmsg,id),_sql(sql){}virtualstringwhatconst{stringstr='SqlException:';str+=_errmsg;str+='->';str+=_sql;returnstr;}private:conststring_sql;};classCacheException:publicException{public:CacheException(conststring&errmsg,intid):Exception(errmsg,id){}virtualstringwhatconst{stringstr='CacheException:';str+=_errmsg;returnstr;}};classHttpServerException:publicException{public:HttpServerException(conststring&errmsg,intid,conststring&type):Exception(errmsg,id),_type(type){}virtualstringwhatconst{stringstr='HttpServerException:';str+=_type;str+=':';str+=_errmsg;returnstr;}private:conststring_type;};voidSQLMgr{srand(time(0));if(rand%7==0){throwSqlException('权限不足',100,'select*fromname='张三'');}cout<<'调用成功'<

可以来看一下结果:

点击加载图片

catch(...){}的作用就是方式其他无匹配的异常类型报错停止程序。

这里其实也用到了多态的调用,通过父类的引用,来调用重写以后的虚函数,从而实现多态调用。

这就很好的解决了问题。

C++提供了一系列标准的异常,我们可以在程序中使用这些标准的异常。

但是

实际中我们可以可以去继承exception类实现自己的异常类。但是实际中很多公司像上面一

样自己定义一套异常继承体系。因为C++标准库设计的不够好用。

只需知道这些异常代表的意义:

点击加载图片

(申请内存空间)

点击加载图片

(越界访问)

5.异常安全

1.构造函数完成对象的构造和初始化,最好不要在构造函数中抛出异常,否则可能导致对象不

完整或没有完全初始化

2.析构函数主要完成资源的清理,最好不要在析构函数内抛出异常,否则可能导致资源泄漏(内

存泄漏、句柄未关闭等)

3.C++中异常经常会导致资源泄漏的问题,比如在new和delete中抛出了异常,导致内存泄

漏,在lock和unlock之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题,关于RAII

会在智能指针进行讲解。(我们下期再见)

6.异常的优缺点

优点:

1.异常对象定义好了,相比错误码的方式可以清晰准确的展示出错误的各种信息,甚至可以包含堆栈调用的信息,这样可以帮助更好的定位程序的bug。

2.返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那

么我们得层层返回错误,最外层才能拿到错误。但C++的异常可以直接跳转到捕获异常的位置。

错误码返回要层层判断,当前遇到错误,返回上一层要判断返回的错误码。

点击加载图片

缺点:

1.异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。这会

导致我们跟踪调试时以及分析程序时,比较困难。

2.异常会有一些性能的开销。当然在现代硬件速度很快的情况下,这个影响基本忽略不计。

3.C++没有垃圾回收机制,资源需要自己管理。有了异常非常容易导致内存泄漏、死锁等异常

安全问题。这个需要使用RAII来处理资源的管理问题。学习成本较高。

总之,利大于弊!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
嵌入式数据库SQLite3相关操作
如何用C语言操作sqlite3,一文搞懂
Oracle 动态SQL返回单条结果和结果集
Oracle的存储过程如果返回结果集
C++ Builder 2007中应用数据库SQLite
oracle 失效对象自动重新编译
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服