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++的异常处理的方法相关推荐

  1. Python 多进程异常处理的方法,你会吗

    最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较'重'的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较'重'的功能 ...

  2. python爬虫网络请求超时_python总urllib,伪装,超时设置,异常处理的方法

    python爬虫之urllib,伪装,超时设置,异常处理的方法 Urllib 1. Urllib.request.urlopen().read().decode() 返回一个二进制的对象,对这个对象进 ...

  3. icop java,java基于spring注解AOP的异常处理的方法

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  4. php的异常处理方式,php异常处理基本方法

    当一个php脚本运行时,为了防止脚本运行崩溃,亦或是当php作为webserver,为了防止php程序出错,抛出httpcode500错误,我们常常需要对php程序做异常处理. 今天介绍的是最基本的异 ...

  5. python异常处理的方法_python异常处理的四种方式,不只是try

    对于python程序中,进行异常捕获,一般我们都用try except,但是还有其他方式经常使用. 以后再进行异常处理时,知道有四种方式,可以考虑更合适的方式 下面介绍一下四种方式 1.内部抛出异常( ...

  6. MVC3异常处理的方法

    1.采用内置的HandleErrorAttribute对象,跳转到指定错误页 示例:http://www.cnblogs.com/TomXu/archive/2011/12/15/2285432.ht ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第1节 异常_8_Throwable类中3个异常处理的方法...

    getMessage 让他出现异常 toString 直接打印e默认调用的就是toString的方法 printStatckTrace 转载于:https://www.cnblogs.com/wang ...

  8. java.Net.UnknownHostException异常处理的方法

    在使用springboot整合redis时,发生了该异常java.Net.UnknownHostException 解决方案 修改Linux中的/etc/hosts文件 ifconfig 查看ip h ...

  9. Windows 桌面图标异常处理解决方法

    1.win键 + R ,输入regedit 2.找到HKEY_CLASSES_ROOT文件夹并在文件目录中按照以下操作进行 3.新建一个txt文件夹并编辑以下代码,然后保存为bat格式 @echo o ...

最新文章

  1. Python中读取ZIP文件
  2. 和jwt_秒懂 JWT
  3. 笔记-信息系统开发基础-架构设计-软件系统架构视图
  4. 【工业控制】OmniCal软件安装和使用详解
  5. InvocationHandler的invoke方法如何被调用?
  6. 打印基于某category创建的所有product
  7. linux使用vim开启文档,linux 配置 直接用VIM默认打开文件
  8. 美国留学计算机网络技术,美国留学计算机专业详解
  9. SpringBoot(10)
  10. MessageBox函数
  11. Java学生管理系统(数组版)
  12. WordPress 3.3 –“ Sonny”发布
  13. 易泊夏武离线车牌识别,车牌识别SDK
  14. Linux之常见面试题知识点批注(六)
  15. 台式主机插入耳机没声音
  16. 用PS制作燃烧的火焰人物
  17. webpack学习之路------配置多个 HTML 文件
  18. Latex声调(一声、二声、三声等)
  19. in-place运算总结
  20. [CF1336F]Journey

热门文章

  1. 香港城市大学刘晨老师组招收机器学习方向全奖博士/博后/研究助理
  2. matlab查看频频,matlab中如何能统计点出现的频次呢?
  3. apache 中 RewriteCond 介绍
  4. 深耕Java多线程 - 死锁、活锁、饥饿
  5. 我走进OPPO店, 掏出一加, 店员来了句, 一加也是我们家的!
  6. 软RAID和硬RAID的区别
  7. 老年公寓人员定位管理系统:提升安全与关怀的智能解决方案
  8. Python遍历文件夹查找大文件
  9. 什么是SOCKET通信,看完马上明白
  10. Linux 实现校园网认证