异常不是错误,异常是程序中可预料到的另一条执行分支,是可预见的。错误是不可预料的。

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++异常简介的更多相关文章

  1. 第10课 C++异常简介

    1. try-catch语句 (1)try语句处理正常代码逻辑 (2)catch语句处理异常情况 (3)try语句中的异常由对应的catch语句处理 (4)C++通过throw语句抛出异常信息 2. ...

  2. 【C语言探索之旅】 第一部分第十课:练习题+习作

    内容简介 1.课程大纲 2.第一部分第十课: 练习题+习作 3.第二部分第一课预告: 模块化编程 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三 ...

  3. Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码

    Kali Linux Web 渗透测试视频教—第二十课-利用kali linux光盘或者usb启动盘破解windows密码 文/玄魂 目录 Kali Linux Web 渗透测试视频教—第二十课-利用 ...

  4. Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter

    Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter 原文链接:http://www.xuanhun521.com/Blog/7fc11b7a-b6cb-4 ...

  5. Kali Linux Web 渗透测试视频教程—第十课 w3af

    Kali Linux Web 渗透测试视频教程—第十课 w3af 文/玄魂 原文链接:http://www.xuanhun521.com/Blog/2014/10/24/kali-linux-web- ...

  6. Java异常(一) Java异常简介及其架构

    概要 本章对Java中的异常进行介绍.内容包括:Java异常简介Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.html ...

  7. NeHe OpenGL教程 第四十课:绳子的模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. NeHe OpenGL教程 第三十课:碰撞检测

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. NeHe OpenGL教程 第二十课:蒙板

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. 关于使用ubuntu的那些事儿

    最近把笔记本的系统由windows改成了ubuntu的最新版系统了,其实改变系统最主要的目的就是希望自己能够快速的学会使用linux系统. 所以这是一篇记录了关于一个ubuntu小白第一次使用ubun ...

  2. mydumper安装

    安装依赖包: yum install glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel cmake 下载二进制包: wget ht ...

  3. ubuntu16.04(64位)安装 Drcom

    一 : 下载DrClient(DrcomAndPPOE) 解压   下载地址 https://www.baidu.com/s?wd=DrClient(DrcomAndPPOE)&rsv_spt ...

  4. CCPC-Wannafly Winter Camp Day4 (Div2, onsite)

    Replay Dup4: 两轮怎么退火啊? 简单树形dp都不会了,送了那么多罚时 简单题都不想清楚就乱写了,喵喵喵? X: 欧拉怎么回路啊, 不会啊. 还是有没有手误?未思考清楚或者未检查就提交, 导 ...

  5. Python 如何判断一个函数是generator函数?

    如何判断一个函数是否是一个特殊的 generator 函数?可以利用 isgeneratorfunction 判断: >>>from inspect import isgenerat ...

  6. python 字典(dict)get方法应用

    如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这里我们可以用字典做一个小游戏,假设用 ...

  7. Vue学习笔记之Vue的面向对象

    0x00 准备工作 JavaScript 语言中,生成实例对象的传统方法是通过构造函数. function Animal(name,age){ this.name = name; this.age = ...

  8. 20145105 《Java程序设计》第4周学习总结

    20145105 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 一.何谓继承 (一)继承共同行为 继承基本上就是避免多个类间重复定义共同行为. 如:下述代码将剑 ...

  9. 20145326蔡馨熠 实验三 "敏捷开发与XP实践"

    20145326蔡馨熠 实验三 "敏捷开发与XP实践" 程序设计过程 一.实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 1.git上传代码 首先我通 ...

  10. php+mysql 注入基本过程

    当mysql版本>5.0时我们只需要访问information_schema库即可查询数据库的相关概要信息,而对于<5.0的版本则需要爆破,今天我们测试的环境是mysql 5.5.40,对 ...