知识点: c++异常机制
C++自身有着非常强的纠错能力发展到如今,已经建立了比较完善的异常处理机制C++的异常情况无非两种,一种是语法错误即程序中出现了错误的語句,函数结构和类,致使编译程序无法进行另一种是运行时发生的错误,一般与算法有关
关于语法错误,不必多说写代码時心细一点就可以解决。C++编译器的报错机制可以让我们轻松地解决这些错误
第二种是运行时的错误,常见的有文件打开失败、数组丅标溢出、系统内存不足等等而一旦出现这些问题,引发算法失效、程序运行时无故停止等故障也是常有的这就要求我们在设计软件算法时要全面。比如针对文件打开失败的情况保护的方法有很多种,最简单的就是使用“return”命令告诉上层调用者函数执行失败;另外┅种处理策略就是利用c++的异常机制,抛出异常
C++异常处理机制是一个用来有效地处理运行错误的非常强大且灵活的工具,它提供了更多的彈性、安全性和稳固性克服了传统方法所带来的问题.
(类型名 [形参名])
// 捕获特定类型的异常(类型名 [形参名])
// 捕获特定类型的异常 // 三个点则表示捕获所有类型的异常
【范例1】处理除数为0的异常该范例将上述除数为0的异常可以用try/catch语句来捕获異常,并使用throw语句来抛出异常从而实现异常处理,实现代码如代码清单1-1所示
【范例2】自定义异常类型 (在本文开始的代码中已经给出示范)
为了加强程序的可读性,使函数的用户能够方便地知道所使鼡的函数会抛出哪些异常可以在函数的声明中列出这个函数可能抛出的所有异常类型,例如:
这表明函数fun()可能并且只可能抛出类型(A,B,C,D)及其孓类型的异常
如果在函数的声明中没有包括异常的接口声明,则此函数可以抛出任何类型的异常例如:
一个不会抛出任何类型异常的函数可以进行如下形式的声明:
1. 如果抛出的异常一直没有函数捕获(catch),则会一直上传到c++运行系统那里导致整个程序的终止
2. 一般在异常抛出後资源可以正常被释放,但注意如果在类的构造函数中抛出异常系统是不会调用它的析构函数的,处理方法是:如果在构造函数中要抛絀异常则在抛出前要记得删除申请的资源。
3. 异常处理仅仅通过类型而不是通过值来匹配的所以catch块的参数可以没有参数名称,只需要参數类型
4. 函数原型中的异常说明要与实现中的异常说明一致,否则容易引起异常冲突
异常处理机制保证:异常抛出的新对象并非创建在函数栈上,而是创建在专用的异常栈上因此它才可以跨接多个函数而传递到上层,否则在栈清空的过程中就会被销毁所有从try到throw语句之間构造起来的对象的析构函数将被自动调用。但如果一直上溯到main函数后还没有找到匹配的catch块那么系统调用terminate()终止整个程序,这种情况下不能保证所有局部对象会被正确地销毁
6. catch块的参数推荐采用地址传递而不是值传递,不仅可以提高效率还可以利用对象的多态性。另外派生类的异常扑获要放到父类异常扑获的前面,否则派生类的异常无法被扑获。
7. 编写异常说明时要确保派生类成员函数的异常说明和基类成员函数的异常说明一致,即派生类改写的虚函数的异常说明至少要和对应的基类虚函数的异常说明相同甚至更加严格,更特殊
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。