| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++之异常处理 -> 正文阅读 |
|
[C++知识库]C++之异常处理 |
为什么引入异常在C语言中错误的处理,通常采用返回值的方式或是使用全局变量的方式。这就存在两个问题,一是如果返回值正是我们需要的数据,这就导致了返回数据同出错数据容错差不高。 因此C++引入了面向对象级别的异常处理机制。 在C++中异常的处理和具体逻辑的处理不比在同一个函数中,这样就可以做到底层逻辑专注于功能的实现,具体错误处理交由上层业务逻辑去处理。 异常如何使用?使用关键字
正如上面的例子所示,当函数 栈展开当抛出一个异常后,程序暂停当前函数的执行过程并立即开始寻找与异常类型匹配的catch代码块,如果找到了匹配的catch,就使用该catch处理异常,如果这一步没找到匹配的catch且该try语句嵌套在其他try块中,则继续检查与外层try匹配的catch代码块, 最终如果都没有找到与之匹配的catch块则将异常交由系统进行处理,而系统一般的默认处理是调用系统函数 例如在上面的例子中,函数 当一个异常被抛出时,沿着调用链的块将依次退出直至找到与异常匹配的处理代码的过程就是栈展开的过程。 重新抛出有时,一个单独的catch语句不能完整地处理某个异常。在执行了某些校正操作之后,当前的catch可能会交由调用链更上一层的函数接着处理异常,这时候就可以使用不带参数的关键字
如果使用指针的方式抛出异常,然后该异常又被重新抛出了呢?到底在哪一步删除这个指针呢?这是一个纠结的问题? 异常捕获类型就像函数可以通过值传递、指针传递、引用传递一样,在catch代码块中我们也可以异常捕获值、异常捕获指针、异常捕获引用,既然选择这么多,那么到底捕获什么才是最优解呢? 对于好东西来说当然是多多益善,但是对于异常来说就是洪水猛兽呀。。。 在《More Effective C++》中条款13:
也就是说大师建议我们通过异常捕获引用的方式来传递异常信息。为什么这样建议呢,异常捕获值、异常捕获指针是有什么弊端吗?更多具体的细节童鞋们可以去看看《More Effective C++》这本书,
既然建议使用异常捕获引用的方式处理异常,而异常发生时抛出的对象一般又是局部变量。在平时写程序的过程中我们总是被不断地强调说不能返回一个局部变量的引用,那异常引用在这里不是矛盾了么? 在这里需要注意的一个点就是:一个对象被抛出作为exception时,总是会发生复制的。即使被抛出的对象并没有瓦解的危险,复制行为还是会发生,所以如果有自定义类型,要考虑好自定义类型的拷贝问题。 我们用以下的代码验证一下:
输出:
在上面程序中我们发现返回在普通函数中返回临时对象的引用和在异常中使用引用捕获他们的拷贝函数和析构函数的执行顺序是不一样的。 那么又有一个问题了,不是说以引用传递参数的方式可以减少拷贝吗?为什么在异常中使用引用就发生了拷贝呢? noexcept在C++11新标准中,我们可以通过提供noexcept指定某个函数不会抛出异常。 noexcept说明符接受一个可选的实参,该实参必须能转换为bool类型:如果实参是true,则函数不会抛出异常;如果实参是false,则函数可能抛出异常:
用noexcept声明了函数是告诉编译器这个函数是不会抛出异常的,编译器可以根据声明优化代码。但是noexcept仅仅是告诉编译器不会抛出异常,但函数不一定真的不会抛出异常, 更多关于异常处理的相关注意条款可以参考《More Effective C++》及《Effective C++》这两本圣经。 推荐阅读C++之指针扫盲 关注我,一起进步,人生不止coding!!! |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:58:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |