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

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. Flask上下文管理及源码刨析

    基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...

  2. C# 多线程编程第二步——线程同步与线程安全

    上一篇博客学习了如何简单的使用多线程.其实普通的多线程确实很简单,但是一个安全的高效的多线程却不那么简单.所以很多时候不正确的使用多线程反倒会影响程序的性能. 下面先看一个例子 : class Pro ...

  3. VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程 ...

  4. Vue学习笔记之Webpack介绍

    在这里我仅仅的是对webpack做个讲解,webpack这个工具非常强大,解决了我们前端很繁琐的一些工具流程繁琐的事情.如果感兴趣的同学,简易还是看官网吧. 中文链接地址:https://www.we ...

  5. 前端学习笔记之JavaScript

    JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客 ...

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

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

  7. HDU 2457 DNA repair(AC自动机+DP)题解

    题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...

  8. POJ 1780 Code(欧拉回路+非递归dfs)

    http://poj.org/problem?id=1780 题意:有个保险箱子是n位数字编码,当正确输入最后一位编码后就会打开(即输入任意多的数字只有最后n位数字有效)……要选择一个好的数字序列,最 ...

  9. Ubuntu14.04,16.04(桌面版)找回root 密码

    一.重启系统,按住shift键直到出现GUN GRUB界面(下图) 选择advanced options,按回车 然后移动选择到recovery mode ,接着按下e,不要按回车,因为我们要进入可写 ...

  10. [转][osg]osg渲染引擎框架图,流程图(根据《最长一帧》整理)

    转自:http://m.blog.csdn.net/article/details?id=49679731 本文参考<<osg最长一帧>>, <<OpenScene ...