第十课 C++异常简介
异常不是错误,异常是程序中可预料到的另一条执行分支,是可预见的。错误是不可预料的。
C++内置了异常处理的语法元素try...catch...,如下:

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

上图中throw 0抛出异常后,程序就立即返回了。return代表正常的返回,throw代表异常的返回值。
C++异常处理分析:
throw抛出的异常必须被catch处理
当前函数能够处理异常,程序继续往下执行
当前函数无法处理异常,则函数停止执行并返回
未被处理的异常则顺着函数调用栈向上传播:

异常的示例程序如下:
#include <iostream> using namespace std; double divide(double a, double b)
{
const double delta = 0.000000000000001;
double ret = ; if( !((-delta < b) && (b < delta)) ) {
ret = a / b;
}
else {
throw ; // 产生除 0 异常
} return ret;
} int main()
{
cout << "main() begin " << endl; try
{
divide(, );
}
catch(...)
{
cout << "Divided by zero" << endl;
} cout << "main() end " << endl;
return ;
}
执行结果如下:

26行的异常被28行的catch捕获,处理完这个异常之后,程序继续向下执行,33行成功打印出信息。
更改程序如下:
#include <iostream> using namespace std; double divide(double a, double b)
{
const double delta = 0.000000000000001;
double ret = ; if( !((-delta < b) && (b < delta)) ) {
ret = a / b;
}
else {
throw ; // 产生除 0 异常
} return ret;
} int main()
{
cout << "main() begin " << endl; try
{
int c = divide(, ); cout << "c = " << c << endl;
}
catch(...)
{
cout << "Divided by zero" << endl;
} cout << "main() end " << endl;
return ;
}
执行结果如下:

可以看到第28行的打印没有输出。
如果try中的语句没有发生异常,catch中的语句是不会执行的。
同一个try语句可以跟上多个catch语句:

异常处理的匹配规则:

捕捉异常的示例程序:
#include <iostream> using namespace std; double divide(double a, double b)
{
const double delta = 0.000000000000001;
double ret = ; if( !((-delta < b) && (b < delta)) ) {
ret = a / b;
}
else {
throw ; // 产生除 0 异常
} return ret;
} void Demo1()
{
try
{
throw 'c';
}
catch(int i)
{
cout << "catch (int i) " << endl;
}
catch(double d)
{
cout << "catch(double d)" << endl;
}
catch(char c)
{
cout << "catch(char c)" << endl;
}
} int main()
{
cout << "main() begin " << endl; try
{
int c = divide(, ); cout << "c = " << c << endl;
}
catch(...)
{
cout << "Divided by zero" << endl;
} Demo1(); cout << "main() end " << endl;
return ;
}
执行结果如下:

异常捕捉示例程序:
#include <iostream> using namespace std; double divide(double a, double b)
{
const double delta = 0.000000000000001;
double ret = ; if( !((-delta < b) && (b < delta)) ) {
ret = a / b;
}
else {
throw ; // 产生除 0 异常
} return ret;
} void Demo1()
{
try
{
throw 'c';
}
catch(int i)
{
cout << "catch (int i) " << endl;
}
catch(double d)
{
cout << "catch(double d)" << endl;
}
catch(char c)
{
cout << "catch(char c)" << endl;
}
} void Demo2()
{
throw "D.T.Software"; // const char*
} int main()
{
cout << "main() begin" << endl; try
{
double c = divide(, ); cout << "c = " << c << endl;
}
catch(...)
{
cout << "Divided by zero..." << endl;
} Demo1(); try
{
Demo2();
}
catch(char* c)
{
cout << "catch(char* c)" << endl;
}
catch(const char* cc)
{
cout << "catch(char* cc)" << endl;
}
catch(...)
{
cout << "catch(...)" << endl;
} cout << "main() end" << endl; return ;
}
执行结果如下:

catch捕捉异常时,是类型严格匹配的,不会进行类型转换。字符串是const char*类型。
小结:
C++中直接支持异常处理的概念。
try...catch...是C++中异常处理的专用语句。
try语句处理正常代码逻辑,catch语句处理异常情况。
同一个try语句可以跟上多个catch语句。
异常处理必须严格匹配,不进行任何的类型转换。
第十课 C++异常简介的更多相关文章
- 第10课 C++异常简介
1. try-catch语句 (1)try语句处理正常代码逻辑 (2)catch语句处理异常情况 (3)try语句中的异常由对应的catch语句处理 (4)C++通过throw语句抛出异常信息 2. ...
- 【C语言探索之旅】 第一部分第十课:练习题+习作
内容简介 1.课程大纲 2.第一部分第十课: 练习题+习作 3.第二部分第一课预告: 模块化编程 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三 ...
- Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码
Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码 文/玄魂 目录 Kali Linux Web 渗透测试视频教—第二十课-利用 ...
- Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter
Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter 原文链接:http://www.xuanhun521.com/Blog/7fc11b7a-b6cb-4 ...
- Kali Linux Web 渗透测试视频教程—第十课 w3af
Kali Linux Web 渗透测试视频教程—第十课 w3af 文/玄魂 原文链接:http://www.xuanhun521.com/Blog/2014/10/24/kali-linux-web- ...
- Java异常(一) Java异常简介及其架构
概要 本章对Java中的异常进行介绍.内容包括:Java异常简介Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.html ...
- NeHe OpenGL教程 第四十课:绳子的模拟
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第三十课:碰撞检测
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第二十课:蒙板
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
随机推荐
- java:判断二进制数据中第n位是否为1
可以使用位运算来判断. &是位的与运算符,是指二进制数按位“与”的操作, 逻辑与就是两者都为真的时候才为真,其他真假,假真,假假的运算结果都是假.二进制写法如下 1 & 1 = 1 , ...
- Python Web开发之路
Flask相关 1.DBUtils数据库连接池 2.Flask之初体验 3.Flask之WTForms 4.Flask之信号 5.Flask之flask-session 6.Flask之flask-s ...
- 3.1 Templates -- Handlerbars Basics(Handlerbars基础知识)
一.简介 Ember.js使用Handlerbars模板库来强化应用程序的用户界面.它就像普通的HTML,但也给你嵌入表达式去改变现实的内容. Ember使用Handlerbars并且用许多新特性去扩 ...
- king 选 太子
king 选 太子 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 啊,从前有一个国家.此国兵强马壮,但是国王却身体不好.于是就想挑一位太子出来: 但是问题来了,国王 ...
- WebService—CXF—实现接口发布和客户端调用
(一)接口发布的几种方式 定义接口: @WebService(targetNamespace="http://www.itfad.net/queryUser") public in ...
- Python:执行精确的浮点数运算
需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现. 浮点数的一个普遍问题是它们并不能精确的表示十进制数.并且,即使是最简单的数学运算也会产生小的误差,比如: >>> a ...
- jQuery源码分析--Event模块(3)
最后剩下了事件的手动触发了.jQuery提供了两个函数trigger和triggerHandler来手动触发事件,可以触发原生事件和自定义的事件.这个触发不单只会触发有jQuery绑定事件,而且也会触 ...
- Centos75 firewalld防火墙
Centos75 防火墙iptables被firewalld取代 #启动firewalld systemctl start firewalld #查看firewalld systemctl statu ...
- linux及安全第六周总结——20135227黄晓妍
总结部分: 操作系统内核三大功能: 进程管理,内存管理,文件系统 最核心的是进程管理 为了管理,首先要对每一个进程进行描述.进程描述符提供了所有内核需要了解的信息. 进程控制模块:task_struc ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第三周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第三周学习总结 教材学习内容总结 本周内容主要为书第五章内容: 队列 线性集合(元素从一端加入,另一端删除) 先进先 ...