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 ...
随机推荐
- 计算机网络(十),HTTP的关键问题
目录 1.在浏览器地址栏键入URL,按下回车之后经历的流程 2.HTTP状态码 3.GET请求和POST请求的区别 4.Cookie和Session的区别 5.IPV4和IPV6 十.HTTP的关键问 ...
- C语言 - strlen的编程实现及总结
一.函数strlen的编程实现 1.strlen函数的实现 原型: size_t strlen(const char *str); 头文件:#include <string.h> 功能:计 ...
- POJ 2299 Ultra-QuickSort (树状数组 && 离散化)
题意 : 给出一个数n(n<500,000), 再给出n个数的序列 a1.a2.....an每一个ai的范围是 0~999,999,999 要求出当通过相邻两项交换的方法进行升序排序时需要交换 ...
- windows下安装geopandas
在linux下没任何问题,直接 pipenv install geopandas, 各种依赖库该编译的编译,该依赖的依赖. win下pyproj4编译不过,而且gdal库什么的也都是问题,建议全部从h ...
- 51 Nod Bash 游戏v2
1067 Bash游戏 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 取消关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3 ...
- vim文件编辑器
Vim 是 Vi 的增强版(在 Vi 的基础上增加了正则表达式的查找.多窗口的编辑等功能),使用 Vim 进行程序开发会更加方便. 想深入了解 Vi 和 Vim 的区别,可以在 Vim 命令模式下输入 ...
- 利用gephi作人物网络图
一.先利用word2vec训练数据得到模型 a.利用jieba对文本进行分词,并只提取词性为人名的词,去除分词长度为1和大于4的词 b.利用word2vec训练分词后的文本,并存储 c.利用训练后的模 ...
- unittest详解(一) unittest初识
unittest是python内置的一个单元测试框架,在学习怎么使用它之前,我们先来了解它的一些概念和原理. Test Case:测试用例,一个TestCase的实例就是一个测试用例.什么是测试用例呢 ...
- mysql bit 和 tinyint 的区别及使用场景?
bit类型语法:bit[(M)] : 位字段类型.M表示每个值的位数,范围从1到64.如果M被忽略,默认为1. tinyint是数字类型,存储小数, 一般对应编辑语言里的小字典或枚举类型. 节省空间的 ...
- C++入门经典-例2.12-求逻辑表达式的值
1:代码如下: // 2.12.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using ...