C++中的异常处理(上)
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++中的异常处理(上)相关推荐
- java异常处理怎么加_带你了解Java中的异常处理(上)
当当当当当当,各位看官,好久不见,甚是想念. 今天我们来聊聊Java里的一个小妖精,那就是异常. 什么是异常?什么是异常处理? 异常嘛,顾名思义就是不正常,(逃),是Java程序运行时,发生的预料之外 ...
- 关于C#中async/await中的异常处理(上)
关于C#中async/await中的异常处理(上) 参考文章: (1)关于C#中async/await中的异常处理(上) (2)https://www.cnblogs.com/sunjie9606/p ...
- Visual C++中的异常处理浅析(上)
Visual C++中的异常处理浅析 作者:宋宝华 e-mail:[email]21cnbao@21cn.com[/email] Visual C++提供了对C语言.C++语言及MFC的支持,因而其 ...
- 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 ...
- kotlin中的异常处理_如何使用assertFailsWith在Kotlin中测试异常
kotlin中的异常处理 by Daniel Newton 丹尼尔·牛顿 如何使用assertFailsWith在Kotlin中测试异常 (How to test exceptions in Kotl ...
- PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)
PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别) 一.总结 一句话总结: throwable接口+Error类 在PHP7更新中有一条:更多的Error变为可捕获的Exce ...
- Swift41/90Days - 面向轨道编程 - Swift 中的异常处理
问题 在开发过程中,异常处理算是比较常见的问题了. 举一个比较常见的例子:用户修改注册的邮箱,大概分为以下几个步骤: 接收到一个用户的请求:我要修改邮箱地址 验证一下请求是否合法,将请求进行格式转化 ...
- Arm64中的异常处理
闲话 最近优化环境中出现了多次不同种类的异常,其他文章中也有提及,为此专门去研究了一下Arm64的异常处理机制和代码,之前主要的开发和应用环境为X86,ARM接触很少,也没有机会去研究和学习,总以为不 ...
- 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架
前言 大家好,给大家带来详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架的概述,希望你们喜欢 JAVA 异常 try...catch...finally结构的使用方法 class Tes ...
- 项目中的异常处理应不应该获取后重新抛?
文章目录 前言 一.处理异常的方法 二.问题 解决 前言 工作项目中的异常处理 提示:以下是本篇文章正文内容,下面案例可供参考 一.处理异常的方法 一般在开发中,我们会有业务异常和程序异常两种. 往往 ...
最新文章
- Appium+Python 自动化测试一之:环境安装(Android篇)
- js中的事件委托或是事件代理详解(转载)
- jQuery 表格插件
- centos6虚拟机复制后修改网卡
- Gitflow branch与Docker image tag命名冲突怎么办?
- java从mysql中查数据_java怎么从数据库中查询数据并输出
- 27了,还应该再淡定么
- 财务有必要学python吗-一个来自35岁职场高管的忠告:Python为什么不得不学?
- matlab2c使用c++实现matlab函数系列教程-histc函数
- TestNG 框架的运用
- 方舟服务器后台一直显示正在重启,win10正在重新启动卡住如何解决_win10重启后一直显示正在重新启动的解决教程...
- 【MQTT编程】Last will and Testament(LWT Payload设置)
- 了解Linux操作系统
- Oliver的成绩(score)
- 浅析错误:software IO TLB: coherent allocation failed for device
- yocto 知:官方手册
- 小米9/9 SE于3月19日开放购买!雷军:螺丝刀已备好,百万出货
- 1181: 零起点学算法88——偶数求和(C语言)
- 数据工厂DateFactory简易使用教程
- Excel的常用函数使用