第64课 C++中的异常处理(上)
1. C++内置的异常处理:try-catch
(1)try语句处理正常代码逻辑
(2)catch语句处理异常情况
(3)try语句中的异常由对应的catch语句处理,如果对应的catch中没有处理该异常,会自动继续沿函数调用栈向上被抛出。
2. C++通过throw语句抛出异常情况
double divide(double a, double b)
{
const double delta = 0.000000000000001;
;
if( !((-delta < b) && (b < delta)) )
{
ret = a / b;
}
else
{
throw 0; //产生除0异常
}
return ret;
}
3. C++异常处理分析
(1)throw抛出的异常必须被catch处理
①当前函数能够处理异常,程序继续往下执行
②当前函数无法处理异常,则函数停止执行,并返回
(2)异常处理的流程:未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。

【编程实验】C++异常处理初探
#include <iostream>
using namespace std;
double divide(double a, double b)
{
const double delta = 0.000000000000001;
;
if(!((-delta < b) && (b < delta)))
{
ret = a / b;
}
else
{
; //除0异常时,抛出整数0。
//因异常不在该函数处理,会向外层调用函数传递
}
return ret;
}
int main()
{
try
{
//除0时由于divide函数抛出异常,而在函数内部那里又没有处理该异常,因此异常被继续抛出,到了main函数中
//调用函数的代码之处,而在这里异常被try-catch捕获会转向catch语句中,catch处理完后,会直接转向catch
//语句的后面"return 0;"去执行。而不是转到调用函数的下一行语句(即cout << "r = " << r << endl;)
, );
cout << "r = " << r << endl;
}
catch(...)
{
cout << "Divide by zero..." << endl;
}
;
}
4. 多个catch块
(1)catch语句可以定义捕获具体类型的异常(如处理int型、double型、自定义类型的异常等)
(2)不同类型的异常由不同的catch语句负责处理
(3)throw可以抛出任何类型的异常
(4)catch(…)用于处理所有类型的异常,必须放在所有的catch块之后。
(5)任何异常都只能被捕获(catch)一次。
5. 异常处理的匹配规则
(1)异常抛出后,至上而下严格匹配每一个catch语句处理的类型。
(2)异常处理匹配时,不进行任何的类型转换。

【编程实验】异常类型匹配
#include <iostream>
#include <string>
using namespace std;
void Demo1()
{
try
{
; //1默认为整型,将从上至下严格匹配各catch,即catch(int c)
//如果throw 'c',将匹配catch(char c),注意不进行任何的类型转换!
}
catch(char c)
{
cout << "catch(char c):" << c << endl;
}
catch(short c)
{
cout << "catch(short c):" << c << endl;
}
catch(double c)
{
cout << "catch(double c):" << c << endl;
}
catch(int c)
{
cout << "catch(int c):" << c << endl;
}
catch(...) //所有异常,必须放在所有的catch之后,因为是自上而下匹配的
{
cout << "catch(...)" << endl;
}
}
void Demo2()
{
throw "SantaClaus"; //const char*类型
//throw string("SantaClaus"); //string类型
}
int main()
{
Demo1();
try
{
Demo2();
}
catch(char* s)
{
cout << "catch(char* s):" << s << endl;
}
catch(const char* s)
{
cout << "catch(const char* s):" << s << endl;
}
catch(string s)
{
cout << "catch(string s):" << s << endl;
}
;
}
/*输出结果:
catch(int c):1
catch(const char* s):SantaClaus
*/
6. 小结
(1)C++中直接支持异常处理的概念
(2)try…catch是C++中异常处理的专用语句
(3)try语句处理正常代码逻辑,catch语句处理异常情况。
(4)同一个try语句可以跟上多个catch语句
(5)异常处理必须严格匹配,不进行任何的类型转换。
第64课 C++中的异常处理(上)的更多相关文章
- 第65课 C++中的异常处理(下)
1. C++中的异常处理 (1)catch语句块可以抛出异常 ①catch中获捕的异常可以被重新抛出 ②抛出的异常需要外层的try-catch块来捕获 ③catch(…)块中抛异常的方法是throw; ...
- C++中的异常处理(上)
C++内置了异常处理的语法元素try... catch ...-try语句处理正常代码逻辑-catch语句处理异常情况-try语句中的异常由对应的catch语句处理 try { ,); } catch ...
- 关于C#中async/await中的异常处理(上)-(转载)
在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情, ...
- 关于C#中async/await中的异常处理(上)
关于C#中async/await中的异常处理(上) 2012-04-11 09:15 by 老赵, 17919 visits 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕 ...
- 在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)
为了能中一个系统上开发64或32位C++程序,费了些周折,现在终于能够开始干过了.在此记录此时针对Q5.4版本的32位开发环境配置过程. 1. 下载Qt 5.4 的32位版本,进行安装,安装过程中会发 ...
- 第17课 - make 中的路径搜索(上)
第17课 - make 中的路径搜索(上) 1. 问题 在以往的 make 学习中,我们使用到的 .c 文件和 .h 文件都与 makefile 处在同一个路径.在实际的工程项目中,所有的源文件和头文 ...
- 【repost】JS中的异常处理方法分享
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
- 使用.NET 4.0+ 操作64位系统中的注册表
一.64位系统中的注册表 以 LocalMachine 中的启动项为例: 64位应用的注册表位置还是在: SOFTWARE\Microsoft\Windows\CurrentVersion\Run 而 ...
- umask设置导致的weblogic中的应用上传的文件没有权限打开
去年,在公司的某一weblogic上部署的web应用上传文件后却没有读的权限.因为weblogic在Linux上部署,上传文件是mount到了一台安装了NFS的Windows Server上. 当时本 ...
随机推荐
- 当jquery ajax遇上401请求
jquery ajax是个很常用接口,而在请求时候,可能存在响应401的情况(身份认证过期或未登录),比较容易出现在混合应用上,如何进行身份认证,重发失败请求,还是值得注意的. ajax请求有两种方式 ...
- AngularJS学习笔记之依赖注入
最近在看AngularJS权威指南,由于各种各样的原因(主要是因为我没有money,好讨厌的有木有......),于是我选择了网上下载电子版的(因为它不要钱,哈哈...),字体也蛮清晰的,总体效果还不 ...
- C#各种数组直接的数据复制/转换
之前做Opengl程序,用的的C#的SharpGL这个库,里面有各种奇怪绑定的函数,比如原型为: void glInterleavedArrays(uint format, int stride, v ...
- sharepoint2010问卷调查(4)-实现问卷的重复答复次数(采用自定义字段类型和JS)
sharepoint的问卷调查可以设置重复和一次答复.但是设置一次后,调查过的用户再进行答复.会提示如下图: 分析下:该提示用户体验很不好.给用户感觉是系统出问题了.因此网上有人提出用eventhan ...
- Android自带的theme
android:theme="@android:style/Theme.Dialog" 将一个Activity显示为能话框模式 android:theme="@andro ...
- Android 采用HttpClient提交数据到服务器
在前几篇文章中<Android 采用get方式提交数据到服务器><Android 采用post方式提交数据到服务器>介绍了android的两种提交数据到服务器的方法 本文继续介 ...
- Java中的两个关键字——super、this
Java中的两个关键字——super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...
- iOS沙盒目录结构解析
iOS沙盒目录结构解析 原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713 出于安全考虑,iOS系统的沙盒机制规定每个应 ...
- C#参考书的链接推荐
Visual C#.NET入门与提高http://download.chinaitlab.com/soft/6330.htm 使用Visual C# 开发asp.NET入门http://downloa ...
- sublime text 3 常用快捷键 、常用插件
常用快捷键 查找( Ctrl + P ) 找到任何东西 - :+行号 定位到具体的行 - @+符号 js的函数名, css的选择器名 - #+关键字 定位到特定的关键字 命令面板 (Ctrl ...