第十课 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管线 ...
随机推荐
- 数据挖掘-聚类分析(Python实现K-Means算法)
概念: 聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术.聚类分析也叫分类分析,或者数值分类.聚类的输入是一组未被标记的样本,聚类根 ...
- JPA Spring Data 概述
JPA Spring Data : 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成! 框架怎么可能代替开 ...
- Wannafly挑战赛28 Solution
A:msc和mas Solved. 考虑斐波那契数列,即最多加45次即会超过1e9,直接暴力即可 #include <bits/stdc++.h> using namespace std; ...
- AtCoder Grand Contest 030 Solution
A - Poisonous Cookies 签到. #include <bits/stdc++.h> using namespace std; #define ll long long l ...
- 20155334 2016-2017-2 《Java程序设计》第七周学习总结
20155334 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 第十二章:Lambda 认识Lammbda语法 Lambda去可以重复,符合DRY原则,而且 ...
- python 字节字符串上的字符串操作
问题:想在字节字符串上执行普通的文本操作(比如移除,搜索和替换). 解决方案 1)字节字符串同样也支持大部分和文本字符串一样的内置操作.比如: >>> data = b'Hello ...
- CSS 分页实例
CSS 分页实例 一.简单分页 如果你的网站有很多个页面,你就需要使用分页来为每个页面做导航. 以下实例演示了如何使用 HTML 和 CSS 来创建分页: <!DOCTYPE html> ...
- [BZOJ2834]回家的路
Description Input Output Sample Input 2 1 1 2 1 1 2 2 Sample Output 5 思路还是很简单的,然而最短路打错各种对拍各种调了一早上 ...
- 试着用React写项目-利用react-router解决跳转路由等问题(一)
转载请注明出处:王亟亟的大牛之路 继续本周的大方向,继续学习React,昨天把简单的hi all内容呈现出来后,今天研究如何多页面或者实现页面嵌套, 开始今天的内容前老规矩,先安利:https://g ...
- Codeforces Round #402 (Div. 2) A,B,C,D,E
A. Pupils Redistribution time limit per test 1 second memory limit per test 256 megabytes input stan ...