C++的异常处理的方法
C++的异常处理的方法
原因
在程序执行过程中,由于程序员的疏忽或是系统资源紧张等因素都有可能导致异常,任何程序都无法保证绝对的稳定,常见的异常有:
- 数组下标越界
- 除法计算时除数为0
- 动态分配空间时空间不足
- …
如果不及时对这些异常进行处理,程序多数情况下都会崩溃。
解决方法
(1)try、throw和catch关键字
C++中的异常处理机制主要使用try、throw和catch三个关键字,其在程序中的用法如下:
#include <iostream>
using namespace std;
int main()
{double m = 1, n = 0;try {cout << "before dividing." << endl;if (n == 0)throw - 1; //抛出int型异常else if (m == 0)throw - 1.0; //拋出 double 型异常elsecout << m / n << endl;cout << "after dividing." << endl;}catch (double d) {cout << "catch (double)" << d << endl;}catch (...) {cout << "catch (...)" << endl;}cout << "finished" << endl;return 0;
}
//运行结果
//before dividing.
//catch (...)
//finished
代码中,对两个数进行除法计算,其中除数为0。可以看到以上三个关键字,程序的执行流程是先执行try包裹的语句块,如果执行过程中没有异常发生,则不会进入任何catch包裹的语句块,如果发生异常,则使用throw进行异常抛出,再由catch进行捕获,throw可以抛出各种数据类型的信息,代码中使用的是数字,也可以自定义异常class。**catch根据throw抛出的数据类型进行精确捕获(不会出现类型转换),如果匹配不到就直接报错,可以使用catch(…)的方式捕获任何异常(不推荐)。**当然,如果catch了异常,当前函数如果不进行处理,或者已经处理了想通知上一层的调用者,可以在catch里面再throw异常。
(2)函数的异常声明列表
有时候,程序员在定义函数的时候知道函数可能发生的异常,可以在函数声明和定义时,指出所能抛出异常的列表,写法如下:
int fun() throw(int,double,A,B,C){...};
这种写法表名函数可能会抛出int,double型或者A、B、C三种类型的异常,如果throw中为空,表明不会抛出任何异常,如果没有throw则可能抛出任何异常
举例
#include <iostream>
#include <string>using namespace std;int func(int i, int j) throw(int, char){if ((0 < j) && (j < 10)){return (i + j);}else{throw '0';}
}void test(int i) try{cout << "func(i, i) = " << func(i, i) << endl;
}
catch (int j)
{cout << "Exception: " << j << endl;
}
catch (...)
{cout << "Exception..." << endl;
}int main(int argc, char* argv[])
{test(5);test(10);return 0;
}运行结果
func(i, i) = 10
func(i, i) = Exception...
int func()函数 后面指定了可能抛出的异常类型为 int 和 char 类型,也就是说func函数体在执行过程中可能会抛出int类型或者char类型的异常。
而在 test()函数中,使用了try … catch …语句块把正常代码和异常代码分隔开,当正常代码在执行过程中,无法继续往下执行,就会抛出事先声明好的异常,然后 catch语句块中进行捕获。而catch语句块已经事先声明好数据类型,所以捕获异常数据时,根据异常数据类型来判断执行那段catch语句,如果没有匹配上,就会执行参数为 …的catch语句,它代码任意类型。
由于这里抛出了 char类型 的 ‘0’,所以会执行最后一个catch语句块。
(3)C++标准异常类 exception
C++ 标准库中有一些类代表异常,这些类都是从 exception 类派生而来的,如下图所示
- bad_typeid:使用typeid运算符,如果其操作数是一个多态类的指针,而该指针的值为 NULL,则会拋出此异常,例如:
#include <iostream>
#include <typeinfo>
using namespace std;class A{public:virtual ~A();
};using namespace std;
int main() {A* a = NULL;try {cout << typeid(*a).name() << endl; // Error condition}catch (bad_typeid){cout << "Object is NULL" << endl;}return 0;
}
//运行结果:bject is NULL
- bad_cast:在用 dynamic_cast进行从多态基类对象(或引用)到派生类的引用的强制类型转换时,如果转换是不安全的,则会拋出此异常
- bad_alloc:在用 new运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常
- out_of_range:用 vector 或 string的at成员函数根据下标访问元素时,如果下标越界,则会拋出此异常
以上参考了阿秀的学习笔记
C++的异常处理的方法相关推荐
- Python 多进程异常处理的方法,你会吗
最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较'重'的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较'重'的功能 ...
- python爬虫网络请求超时_python总urllib,伪装,超时设置,异常处理的方法
python爬虫之urllib,伪装,超时设置,异常处理的方法 Urllib 1. Urllib.request.urlopen().read().decode() 返回一个二进制的对象,对这个对象进 ...
- icop java,java基于spring注解AOP的异常处理的方法
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- php的异常处理方式,php异常处理基本方法
当一个php脚本运行时,为了防止脚本运行崩溃,亦或是当php作为webserver,为了防止php程序出错,抛出httpcode500错误,我们常常需要对php程序做异常处理. 今天介绍的是最基本的异 ...
- python异常处理的方法_python异常处理的四种方式,不只是try
对于python程序中,进行异常捕获,一般我们都用try except,但是还有其他方式经常使用. 以后再进行异常处理时,知道有四种方式,可以考虑更合适的方式 下面介绍一下四种方式 1.内部抛出异常( ...
- MVC3异常处理的方法
1.采用内置的HandleErrorAttribute对象,跳转到指定错误页 示例:http://www.cnblogs.com/TomXu/archive/2011/12/15/2285432.ht ...
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第1节 异常_8_Throwable类中3个异常处理的方法...
getMessage 让他出现异常 toString 直接打印e默认调用的就是toString的方法 printStatckTrace 转载于:https://www.cnblogs.com/wang ...
- java.Net.UnknownHostException异常处理的方法
在使用springboot整合redis时,发生了该异常java.Net.UnknownHostException 解决方案 修改Linux中的/etc/hosts文件 ifconfig 查看ip h ...
- Windows 桌面图标异常处理解决方法
1.win键 + R ,输入regedit 2.找到HKEY_CLASSES_ROOT文件夹并在文件目录中按照以下操作进行 3.新建一个txt文件夹并编辑以下代码,然后保存为bat格式 @echo o ...
最新文章
- Python中读取ZIP文件
- 和jwt_秒懂 JWT
- 笔记-信息系统开发基础-架构设计-软件系统架构视图
- 【工业控制】OmniCal软件安装和使用详解
- InvocationHandler的invoke方法如何被调用?
- 打印基于某category创建的所有product
- linux使用vim开启文档,linux 配置 直接用VIM默认打开文件
- 美国留学计算机网络技术,美国留学计算机专业详解
- SpringBoot(10)
- MessageBox函数
- Java学生管理系统(数组版)
- WordPress 3.3 –“ Sonny”发布
- 易泊夏武离线车牌识别,车牌识别SDK
- Linux之常见面试题知识点批注(六)
- 台式主机插入耳机没声音
- 用PS制作燃烧的火焰人物
- webpack学习之路------配置多个 HTML 文件
- Latex声调(一声、二声、三声等)
- in-place运算总结
- [CF1336F]Journey