Daily C/C++ 要用异常吗?
首先说一下我个人的观点,我觉得是要用的,否则C++标准也就会抛弃掉这项特性了
C++标准容器库里面都会使用异常,我们平常使用的new也会抛出异常,所以我觉得我们要用,但是要用好异常,还要对异常有充足的了解
我感觉利用各种错误码来处理错误情况的缺点就是视觉效果很差,我们代码东一个判断,西一个判断,很容易就让人看的眼花缭乱
C++为我们封装好了很多要主动处理错误的情况,比如动态内存分配空间不够
同样的,C++的RAII特性也帮助我们可以更好的管理资源,当抛出异常的时候,我们如果在上层有try catch来捕获异常,RAII可以帮助我们析构栈中分配的资源,并在上层处理异常。这样保证不会泄漏资源。试想一下在一个函数中出现了异常,我们需要手动把前面申请的资源释放,再跳出去是很容易出错的。
同时如果我们没有try catch,直接挂掉程序,有的时候也是一个选择。
C++17开始,他禁用了以往的异常公约,即不再声明可能抛出什么类型的异常,而是只能声明这个函数不会抛出异常。从这里也可以看出来,C++是在不断的改进异常的
那么我们平时要怎么规避异常呢?
写异常安全的代码,保证发生异常的情况下,我们不会去改变对象的内容,也不会产生任何的资源泄漏
对于不会抛出异常的代码,将其标注为noexcept
,对于swap,移动构造函数就尽量要使用noexcept
C++的标准容器提供了强异常安全保证,同时通过异常我们也可以方便去调试,比如C++中容器的at方法,就可以检测出是否下标是否越界
当然了,使用assert等方法进行调试也是很不错的,但是异常可以为我们提供更全面的检测
最后提一下强异常安全和基本的异常安全
基本的异常安全就是会做清理工作,但是不保证数据是否不变
而强异常安全则会回滚状态,使得发生异常时后的状态和调用前是一样的
文章评论