C++中的异常处理(上)
1,C++ 内置了异常处理的语法元素 try ... catch ...;
1,try 语句处理正常代码逻辑;
2,catch 语句处理异常情况;
3,try 语句中的异常由对应的 catch 语句处理;
1,代码示例:
try
{
double r = divide(, ); // divide() 函数里面产生除 0 异常,于是 divide() 函数就会将这个异常抛出到调用的地点,这个地点正好在 try 语句块中,其会将捕捉到的异常扔给下面的 catch 代码块,catch 代码块就可以将除 0 异常捕捉到,于是打印 Divided by zero ...;
}
catch(...)
{
cout << "Divided by zero ..." << endl;
}
2,C++ 通过 throw 语句抛出异常信息:
1,代码示例:
double divide(double a, double b)
{
const double delta = 0.000000001;
double ret = ; if( !((-delta < b) && (b < delta)) )
{
ret = a / b;
}
else
{
throw ; // 0 这个字面值常量代表当前的异常元素,表示产生除 0 异常; 异常元素可以是一个值、一个对象、一个字符串等; 扔出异常元素后,divide() 就会立即返回到调用点;
} return ret;
}
2,C++ 中 throw 这个新的关键字就是用来仍出异常元素的,我们简称为“异常”,每一个异常都需要被 catch 语句来处理;
3,C++ 异常处理分析:
1,throw 抛出的异常必须被 catch 处理:
1,当前函数能够处理异常,程序往下执行;
2,当前函数无法处理异常,则函数停止执行,并返回;
1,返回是异常返回,和正常返回不一样;
2,异常产生后的函数返回是没有返回值的;
2,未被处理的异常会顺着函数调用栈向上传播,知道被处理为止,否则程序将停止执行;

3,C++ 异常处理初探编程实验:
#include <iostream>
#include <string> 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 ;
} return ret;
} int main(int argc, char *argv[])
{
try
{
double r = divide(, ); // 扔出异常后,divide() 自身没有 try...catch...,不能处理异常,所以 divide() 这个函数就会立即的停止并且带着异常元素返回到调用点,而 main() 函数中当也没有try...catch... 语句时,异常向上传播,main() 已经是第一个函数了,则导致整个程序异常停止,编译器显示:terminate called after throwing an instance of 'int',已放弃;当 main() 中包含 try...catch... 语句时,程序正常打印:Divided by zero...; cout << "r = " << r << endl;
}
catch(...) // “...” 表示见下分析;
{
cout << "Divided by zero..." << endl;
} return ;
}
4,同一个 try 语句可以跟上多个 catch 语句:
1,catch 语句可以定义具体处理的异常类型;
2,不同类型的异常由不同的 catch 语句负责处理;
3,try 语句中可以抛出任何类型的异常;
1,try 语句块用于放置可能产生异常的代码,工程里面一般都习惯将正常功能逻辑代码放在 try 语句块中,然后后面跟上多个 catch 语句;
2,可以是一个 int、字符串、对象;
4,catch(...) 用于处理所有类型的异常;
1,一般情况作为最后出场的语句块;
5,任何异常都只能被捕获(catch)一次;
1,只要被 catch 一次,其它的 catch 就没有捕获机会了;
5,异常处理的匹配规则:
1,示意图:

2,try 语句块中直接通过 throw 扔出整型异常;
3,扔出后发现是在 catch 语句块中,然后这个异常就会进行 catch 语句块的匹配;
4,从上向下严格匹配每个 catch 它所需要捕获的异常类型;
5,匹配 catch 语句块所标识的类型时,是不会进行任何的类型转换的;
6,如果说不能够严格匹配上,那么当前的异常没有被捕获,当前的函数就会立即的停止执行,并且带着这个异常沿着函数调用栈顺序的返回;
6,异常类型匹配编程实验:
#include <iostream>
#include <string> using namespace std; void Demo1()
{
try
{
throw 'c';
}
catch(char c)
{
cout << "catch(char c)" << endl;
}
catch(short c)
{
cout << "catch(short c)" << endl;
}
catch(double c)
{
cout << "catch(double c)" << endl;
}
catch(...) // 当把它放到其它 catch 语句块前面的时候,编译器显示:error: '...' handler must be the last handler for its try block;
{
cout << "catch(...)" << endl;
}
} void Demo2()
{
throw "D.T.Software; // 两个分开执行的;
throw string("D.T.Software");
} int main(int argc, char *argv[])
{
Demo1(); try
{
Demo2(); // 认为它可能产生字符串异常,所以将它放到了这里;
}
catch(char* s)
{
cout << "catch(char *s)" << endl;
}
catch(const char* cs) // 没有这个 catch 语句块时,第一个异常执行后编译器显示:terminate called after throwing an instance of 'char const *';
{
cout << "catch(const char *cs)" << endl;
}
catch(string ss)
{
cout << "catch(string ss)" << endl;
} return ;
}
7,小结:
1,C++ 中直接支持异常处理的概念;
2,try ... catch ... 是 C++ 中异常处理的专用语句;
3,try 语句处理正常代码逻辑,catch 语句处理异常情况;
4,同一个 try 语句可以跟上多个 catch 语句;
5,异常处理必须严格匹配,不进行任何的类型转换;
C++中的异常处理(上)的更多相关文章
- 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来捕 ...
- 【repost】JS中的异常处理方法分享
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
- java 中的异常处理
一. 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架, 是Java语言健壮性的一个重要体现. Java把 ...
- Delphi中的异常处理(10种异常来源、处理、精确处理)
一.异常的来源 在Delphi应用程序中,下列的情况都比较有可能产生异常. 1.文件处理 2.内存分配 3.windows资源 4.运行时创建对象和窗体 5.硬件和操作系统冲突 6.网络问题 7.数据 ...
- 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理
原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...
- T-SQL编程中的异常处理-异常捕获(catch)与抛出异常(throw)
本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出,本文简单介绍异常捕获与异 ...
- web应用中的异常处理
楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异常处理方法. 但是平时大家的工作一般是基于开发框架进行的(比如Spring MVC,或Spring Boo ...
- C#多线程中的异常处理
常规Thread中处理异常 使用Thread创建的子线程,需要在委托中捕捉,无法在上下文线程中捕捉 static void Main(string[] args) { ThreadStart thre ...
随机推荐
- 冒泡排序和选择排序(bubble sort and selection sort)
Bubble sort Basic Method: import random nums = [random.randint(1,20) for _ in range(10)] #制作一个无序数字列表 ...
- 暑假集训 #2 div1 I - Lada Priora 精度处理
I - Lada Priora Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- codevs 5969 [AK]刻录光盘x
题目描述 Description • 在FJOI2010夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学 ...
- RESTful规范与django编写restful接口
一.什么是RESTful规范 ①REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” ②REST从资 ...
- Tomcat 激活spring profile
springboot打包war部署到外部tomcat的时候指定profile启动 windows 在%tomcat%/bin下创建setenv.bat文件 linux 在%tomcat%/bin下创建 ...
- Scrapy学习(二)、安装及项目结构
一.安装 1.安装pywin32,下载地址:https://sourceforge.net/projects/pywin32/files/pywin32/ 我选择的是Build 221,点进去,根据自 ...
- [BZOJ5249][九省联考2018]IIIDX:线段树+贪心
分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解. 字典序最大有另一种理解方式,就是让越小的数尽量越靠后. 我们从树的根结点出发,从1开始填数,构造出 ...
- POJ 6621: K-th Closest Distance(主席树 + 二分)
K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others) Memory Limit: 524288/524288 K (Jav ...
- 使用SNMP监控服务器运行情况
系统监测的基本概念及分类: a.系统监测的概述: 如何对现有IT架构的整体以及细节运行情况进行科学.系统和高效地监测是目前各企业运维和管理部门一项非常重要的工作内容.随着当前企业IT环境中服务器.应用 ...
- vim 配置 scala 语法高亮
第一步:执行下面这个命令: mkdir -p ~/.vim/{ftdetect,indent,syntax}for d in ftdetect indent syntax ; do curl -o ~ ...