第十课 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管线 ...
随机推荐
- PHP指定概率算法
转载来源链接: https://blog.csdn.net/sinat_35861727/article/details/54980807 PHP指定概率算法,可用于刮刮卡,大转盘等抽奖算法. 假设: ...
- PHP对象转数组
Solution json_decode( json_encode( $obj ), true ): But why?You should have a look at the function na ...
- JOJ1202。重新操刀ACM,一天一练!做个简单的题目温习。
http://ac.jobdu.com/problem.php?pid=1202 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n<=100). ...
- 基于struts2--实现文件上传下载
1. 文件的上传: 1). 表单需要注意的 3 点 ①. method="post" ②. enctype="mulitipart/form-data" ...
- C#之父
来自为知笔记(Wiz)
- js判断display隐藏显示
// 判断是否为隐藏(css)样式 function isHide(obj) { var ret = obj.style.display === "none" || obj.s ...
- [转]Birdfont 2.10 发布,字体编辑器
最近在忙大数据.黑天鹅算法实盘测试 许久没有更新字库方面的资料,汗一个... 今天转一个 :Birdfont 2.10 发布,字体编辑器 字体编辑器,向来很少,除了fontlab的几个昂贵的商业版,就 ...
- OpenResty api 网关
1,Orange网关 Orange是一个基于OpenResty的API网关.除Nginx的基本功能外,它还可用于API监控.访问控制(鉴权.WAF).流量筛选.访问限速.AB测试.动态分流等.它有以下 ...
- express+mongodb+mongoose简单入门
mongodb安装 window安装方法就不讨论了,比较简单~我们来看一下在linux下面的安装步骤~(这里需要一点linux的简单命令知识哈) 1.下载文件到服务器(先创建好自己想安装的目录)~ c ...
- @Tranactional事务没有回滚
一.特性 先来了解一下@Transactional注解事务的特性吧,可以更好排查问题 1.service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务 ...