1,C++ 内置了异常处理的语法元素 try ... catch ...;

1,try 语句处理正常代码逻辑;

2,catch 语句处理异常情况;

3,try 语句中的异常由对应的 catch 语句处理;

1,代码示例:

1 try
2 {
3     double r = divide(1, 0);  // divide() 函数里面产生除 0 异常,于是 divide() 函数就会将这个异常抛出到调用的地点,这个地点正好在 try 语句块中,其会将捕捉到的异常扔给下面的 catch 代码块,catch 代码块就可以将除 0 异常捕捉到,于是打印 Divided by zero ...;
4 }
5 catch(...)
6 {
7     cout << "Divided by zero ..." << endl;
8 }

2,C++ 通过 throw 语句抛出异常信息:

1,代码示例:

 1 double divide(double a, double b)
 2 {
 3     const double delta = 0.000000001;
 4     double ret = 0;
 5
 6     if( !((-delta < b) && (b < delta)) )
 7     {
 8            ret = a / b;
 9     }
10     else
11     {
12            throw 0;  // 0 这个字面值常量代表当前的异常元素,表示产生除 0  异常; 异常元素可以是一个值、一个对象、一个字符串等; 扔出异常元素后,divide() 就会立即返回到调用点;
13      }
14
15      return ret;
16 }

2,C++ 中 throw 这个新的关键字就是用来仍出异常元素的,我们简称为“异常”,每一个异常都需要被 catch 语句来处理;

3,C++ 异常处理分析:

1,throw 抛出的异常必须被 catch 处理:

1,当前函数能够处理异常,程序往下执行;

2,当前函数无法处理异常,则函数停止执行,并返回;

1,返回是异常返回,和正常返回不一样;

2,异常产生后的函数返回是没有返回值的;

2,未被处理的异常会顺着函数调用栈向上传播,知道被处理为止,否则程序将停止执行;

3,C++ 异常处理初探编程实验:

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 double divide(double a, double b)
 7 {
 8     const double delta = 0.000000000000001;
 9     double ret = 0;
10
11     if( !((-delta < b) && (b < delta)) )
12     {
13         ret = a / b;
14     }
15     else
16     {
17         throw 0;
18     }
19
20     return ret;
21 }
22
23 int main(int argc, char *argv[])
24 {
25     try
26     {
27         double r = divide(1, 0);  // 扔出异常后,divide() 自身没有 try...catch...,不能处理异常,所以 divide() 这个函数就会立即的停止并且带着异常元素返回到调用点,而 main() 函数中当也没有try...catch... 语句时,异常向上传播,main() 已经是第一个函数了,则导致整个程序异常停止,编译器显示:terminate called after throwing an instance of 'int',已放弃;当 main() 中包含 try...catch... 语句时,程序正常打印:Divided by zero...;
28
29         cout << "r = " << r << endl;
30     }
31     catch(...)  // “...” 表示见下分析;
32     {
33         cout << "Divided by zero..." << endl;
34     }
35
36     return 0;
37 }

4,同一个 try 语句可以跟上多个 catch 语句:

1,catch 语句可以定义具体处理的异常类型;

2,不同类型的异常由不同的 catch 语句负责处理;

3,try 语句中可以抛出任何类型的异常;

1,try 语句块用于放置可能产生异常的代码,工程里面一般都习惯将正常功能逻辑代码放在 try 语句块中,然后后面跟上多个 catch 语句;

2,可以是一个 int、字符串、对象;

4,catch(...) 用于处理所有类型的异常;

1,一般情况作为最后出场的语句块;

5,任何异常都只能被捕获(catch)一次;

1,只要被 catch 一次,其它的 catch 就没有捕获机会了;

5,异常处理的匹配规则:

1,示意图:

2,try 语句块中直接通过 throw 扔出整型异常;

3,扔出后发现是在 catch 语句块中,然后这个异常就会进行 catch 语句块的匹配;

4,从上向下严格匹配每个 catch 它所需要捕获的异常类型;

5,匹配 catch 语句块所标识的类型时,是不会进行任何的类型转换的;

6,如果说不能够严格匹配上,那么当前的异常没有被捕获,当前的函数就会立即的停止执行,并且带着这个异常沿着函数调用栈顺序的返回;

6,异常类型匹配编程实验:

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 void Demo1()
 7 {
 8     try
 9     {
10         throw 'c';
11     }
12     catch(char c)
13     {
14         cout << "catch(char c)" << endl;
15     }
16     catch(short c)
17     {
18         cout << "catch(short c)" << endl;
19     }
20     catch(double c)
21     {
22         cout << "catch(double c)" << endl;
23     }
24     catch(...)  // 当把它放到其它 catch 语句块前面的时候,编译器显示:error: '...' handler must be the last handler for its try block;
25     {
26         cout << "catch(...)" << endl;
27     }
28 }
29
30 void Demo2()
31 {
32     throw "D.T.Software;  // 两个分开执行的;
33     throw string("D.T.Software");
34 }
35
36 int main(int argc, char *argv[])
37 {
38     Demo1();
39
40     try
41     {
42         Demo2();  // 认为它可能产生字符串异常,所以将它放到了这里;
43     }
44     catch(char* s)
45     {
46         cout << "catch(char *s)" << endl;
47     }
48     catch(const char* cs)  // 没有这个 catch 语句块时,第一个异常执行后编译器显示:terminate called after throwing an instance of 'char const *';
49     {
50         cout << "catch(const char *cs)" << endl;
51     }
52     catch(string ss)
53     {
54         cout << "catch(string ss)" << endl;
55     }
56
57     return 0;
58 }

7,小结:

1,C++ 中直接支持异常处理的概念;

2,try ... catch ... 是 C++ 中异常处理的专用语句;

3,try 语句处理正常代码逻辑,catch 语句处理异常情况;

4,同一个 try 语句可以跟上多个 catch 语句;

5,异常处理必须严格匹配,不进行任何的类型转换;

转载于:https://www.cnblogs.com/dishengAndziyu/p/10919819.html

C++中的异常处理(上)相关推荐

  1. java异常处理怎么加_带你了解Java中的异常处理(上)

    当当当当当当,各位看官,好久不见,甚是想念. 今天我们来聊聊Java里的一个小妖精,那就是异常. 什么是异常?什么是异常处理? 异常嘛,顾名思义就是不正常,(逃),是Java程序运行时,发生的预料之外 ...

  2. 关于C#中async/await中的异常处理(上)

    关于C#中async/await中的异常处理(上) 参考文章: (1)关于C#中async/await中的异常处理(上) (2)https://www.cnblogs.com/sunjie9606/p ...

  3. Visual C++中的异常处理浅析(上)

    Visual C++中的异常处理浅析 作者:宋宝华  e-mail:[email]21cnbao@21cn.com[/email] Visual C++提供了对C语言.C++语言及MFC的支持,因而其 ...

  4. java day62【 响应数据和结果视图 、 SpringMVC 实现文件上传 、 SpringMVC 中的异常处理 、 SpringMVC 中的拦截器 】...

    第1章 响应数据和结果视图 1.1返回值分类 1.1.1 字符串 1.1.2 void 1.1.3 ModelAndView 1.2转发和重定向 1.2.1 forward 转发 1.2.2 Redi ...

  5. kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常

    kotlin中的异常处理 by Daniel Newton 丹尼尔·牛顿 如何使用assertFailsWith在Kotlin中测试异常 (How to test exceptions in Kotl ...

  6. PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)

    PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别) 一.总结 一句话总结: throwable接口+Error类 在PHP7更新中有一条:更多的Error变为可捕获的Exce ...

  7. Swift41/90Days - 面向轨道编程 - Swift 中的异常处理

    问题 在开发过程中,异常处理算是比较常见的问题了. 举一个比较常见的例子:用户修改注册的邮箱,大概分为以下几个步骤: 接收到一个用户的请求:我要修改邮箱地址 验证一下请求是否合法,将请求进行格式转化 ...

  8. Arm64中的异常处理

    闲话 最近优化环境中出现了多次不同种类的异常,其他文章中也有提及,为此专门去研究了一下Arm64的异常处理机制和代码,之前主要的开发和应用环境为X86,ARM接触很少,也没有机会去研究和学习,总以为不 ...

  9. 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架

    前言 大家好,给大家带来详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架的概述,希望你们喜欢 JAVA 异常 try...catch...finally结构的使用方法 class Tes ...

  10. 项目中的异常处理应不应该获取后重新抛?

    文章目录 前言 一.处理异常的方法 二.问题 解决 前言 工作项目中的异常处理 提示:以下是本篇文章正文内容,下面案例可供参考 一.处理异常的方法 一般在开发中,我们会有业务异常和程序异常两种. 往往 ...

最新文章

  1. Appium+Python 自动化测试一之:环境安装(Android篇)
  2. js中的事件委托或是事件代理详解(转载)
  3. jQuery 表格插件
  4. centos6虚拟机复制后修改网卡
  5. Gitflow branch与Docker image tag命名冲突怎么办?
  6. java从mysql中查数据_java怎么从数据库中查询数据并输出
  7. 27了,还应该再淡定么
  8. 财务有必要学python吗-一个来自35岁职场高管的忠告:Python为什么不得不学?
  9. matlab2c使用c++实现matlab函数系列教程-histc函数
  10. TestNG 框架的运用
  11. 方舟服务器后台一直显示正在重启,win10正在重新启动卡住如何解决_win10重启后一直显示正在重新启动的解决教程...
  12. 【MQTT编程】Last will and Testament(LWT Payload设置)
  13. 了解Linux操作系统
  14. Oliver的成绩(score)
  15. 浅析错误:software IO TLB: coherent allocation failed for device
  16. yocto 知:官方手册
  17. 小米9/9 SE于3月19日开放购买!雷军:螺丝刀已备好,百万出货
  18. 1181: 零起点学算法88——偶数求和(C语言)
  19. 数据工厂DateFactory简易使用教程
  20. Excel的常用函数使用

热门文章

  1. java 二进制输入_把从键盘输入的一个二进制数赋给变量A 然后如何转换为其他进制...
  2. 系统学习NLP(二十七)--EMLo
  3. 系统学习NLP(二十四)--详解Transformer (Attention Is All You Need)
  4. 系统学习深度学习(二十四)--WRN
  5. 运动目标跟踪(十四)--MIL跟踪
  6. 系统学习机器学习之正则化(二)
  7. C语言:要求输入一个字符,如果这个字符是小写字母,将这个字母转换成大写字母,否则保持不变
  8. Sleep 方案解决主备延迟
  9. Hive 分组取Top N
  10. spark graphx入门