本节介绍的出错处理是ANSI-C++ 标准引入的新功能。如果你使用的C++ 编译器不兼容这个标准,则你可能无法使用这些功能。

在编程过程中,很多时候我们是无法确定一段代码是否总是能够正常工作的,或者因为程序访问了并不存在的资源,或者由于一些变量超出了预期的范围,等等。

这些情况我们统称为出错(例外),C++ 新近引入的三种操作符能够帮助我们处理这些出错情况: try, throw 和 catch 。

它们的一般用法是:

 try {// code to be triedthrow exception;}catch (type  exception){// code to be executed in case of exception}

它们所进行的操作是:

  • try 语句块中的代码被正常执行。如果有例外发生,代码必须使用关键字throw 和一个参数来扔出一个例外。这个参数可以是任何有效的数据类型,它的类型反映了例外的特征。
  • 如果有例外发生,也就是说在try 语句块中有一个throw 指令被执行了,则catch 语句块会被执行,用来接收throw传来的例外参数。

例如:

    // exceptions#include <iostream.h>int main () {char myarray[10];try {for (int n=0; n<=10; n++) {if (n>9) throw "Out of range";myarray[n]='z';}} catch (char * str) {cout << "Exception: " << str << endl;}return 0;}   
Exception: Out of range

在这个例子中,如果在n 循环中,n 变的大于9 了,则仍出一个例外,因为数组 myarray[n] 在这种情况下会指向一个无效的内存地址。当throw 被执行的时候,try 语句块立即被停止执行,在try 语句块中生成的所有对象会被销毁。此后,控制权被传递给相应的catch 语句块(上面的例子中即执行仅有的一个catch)。最后程序紧跟着catch 语句块继续向下执行,在上面的例子中就是执行 return 0;.

throw 语法与 return 相似,只是参数不需要扩在括号。

catch 语句块必须紧跟着try 语句块后面,中间不能有其它的代码。catch 捕获的参数可以是任何有效的数据类型。catch 甚至可以被重载以便能够接受不同类型的参数。在这种情况下被执行catch 语句块是相应的符合被throw扔出的参数类型的那一个:

    // exceptions: multiple catch blocks#include <iostream.h>int main () {try {char * mystring;mystring = new char [10];if (mystring == NULL) throw "Allocation failure";for (int n=0; n<=100; n++) {if (n>9) throw n;mystring[n]='z';}} catch (int i) {cout << "Exception: ";cout << "index " << i << " is out of range" << endl;} catch (char * str) {cout << "Exception: " << str << endl;}return 0;}    
Exception: index 10 is out of range

在上面的例子中,有两种不同的例外可能发生:

  1. 如果要求的10个字符空间不能够被赋值(这种情况很少,但是有可能发生):这种情况下扔出的例外会被catch (char * str)捕获。
  2. n超过了mystring的最大索引值(index):这种情况下扔出的例外将被catch (int i)捕获,因为它的参数是一个整型值。

我们还可以定义一个catch 语句块来捕获所有的例外,不论扔出的是什么类型的参数。这种情况我们需要在catch 或面的括号中写三个点来代替原来的参数类型和名称,如:

   try {// code here}catch (...) {cout << "Exception occurred";}

try-catch 也是可以被嵌套使用的。在这种情况下,我们可以使用表达式throw;(不带参数)将里面的catch 语句块捕获的例外传递到外面一层,例如:

   try {try {// code here}catch (int n) {throw;}}catch (...) {cout << "Exception occurred";}

没有捕获的例外 (Exceptions not caught)

如果由于没有对应的类型,一个例外没有被任何catch 语句捕获,特殊函数terminate 将被调用。

这个函数通常已被定义了,以便立即结束当前的进程(process),并显示一个“非正常结束”( "Abnormal termination")的出错信息。它的格式是:

void terminate();

标准例外 (Standard exceptions)

一些C++ 标准语言库中的函数也会扔出一些列外,我们可以用try 语句来捕获它们。这些例外扔出的参数都是std::exception 引申出的子类类型的。这个类(std::exception) 被定义在C++ 标准头文件 中,用来作为exceptions标准结构的模型:

因为这是一个类结构,如果你包括了一个catch 语句块使用地址(reference)来捕获这个结构中的任意一种列外 (也就是说在类型后面加地址符 &),你同时可以捕获所有引申类的例外 (C++的继承原则)。

下面的例子中,一个类型为 bad_typeid 的例外(exception的引申类),在要求类型信息的对象为一个空指针的时候被捕获:

    // standard exceptions#include <iostream.h>#include <exception>#include <typeinfo>class A {virtual void f() {}; };int main () {try {A * a = NULL;typeid (*a);} catch (std::exception& e) {cout << "Exception: " << e.what();}return 0;}            
Exception: Attempted typeid of NULL pointer

本节介绍的出错处理是ANSI-C++ 标准引入的新功能。如果你使用的C++ 编译器不兼容这个标准,则你可能无法使用这些功能。

在编程过程中,很多时候我们是无法确定一段代码是否总是能够正常工作的,或者因为程序访问了并不存在的资源,或者由于一些变量超出了预期的范围,等等。

这些情况我们统称为出错(例外),C++ 新近引入的三种操作符能够帮助我们处理这些出错情况: try, throw 和 catch 。

它们的一般用法是:

   try {// code to be triedthrow exception;}catch (type  exception){// code to be executed in case of exception}

它们所进行的操作是:

  • try 语句块中的代码被正常执行。如果有例外发生,代码必须使用关键字throw 和一个参数来扔出一个例外。这个参数可以是任何有效的数据类型,它的类型反映了例外的特征。
  • 如果有例外发生,也就是说在try 语句块中有一个throw 指令被执行了,则catch 语句块会被执行,用来接收throw传来的例外参数。

例如:

    // exceptions#include <iostream.h>int main () {char myarray[10];try {for (int n=0; n<=10; n++) {if (n>9) throw "Out of range";myarray[n]='z';}} catch (char * str) {cout << "Exception: " << str << endl;}return 0;}   
Exception: Out of range

在这个例子中,如果在n 循环中,n 变的大于9 了,则仍出一个例外,因为数组 myarray[n] 在这种情况下会指向一个无效的内存地址。当throw 被执行的时候,try 语句块立即被停止执行,在try 语句块中生成的所有对象会被销毁。此后,控制权被传递给相应的catch 语句块(上面的例子中即执行仅有的一个catch)。最后程序紧跟着catch 语句块继续向下执行,在上面的例子中就是执行 return 0;.

throw 语法与 return 相似,只是参数不需要扩在括号。

catch 语句块必须紧跟着try 语句块后面,中间不能有其它的代码。catch 捕获的参数可以是任何有效的数据类型。catch 甚至可以被重载以便能够接受不同类型的参数。在这种情况下被执行catch 语句块是相应的符合被throw扔出的参数类型的那一个:

    // exceptions: multiple catch blocks#include <iostream.h>int main () {try {char * mystring;mystring = new char [10];if (mystring == NULL) throw "Allocation failure";for (int n=0; n<=100; n++) {if (n>9) throw n;mystring[n]='z';}} catch (int i) {cout << "Exception: ";cout << "index " << i << " is out of range" << endl;} catch (char * str) {cout << "Exception: " << str << endl;}return 0;}    
Exception: index 10 is out of range

在上面的例子中,有两种不同的例外可能发生:

  1. 如果要求的10个字符空间不能够被赋值(这种情况很少,但是有可能发生):这种情况下扔出的例外会被catch (char * str)捕获。
  2. n超过了mystring的最大索引值(index):这种情况下扔出的例外将被catch (int i)捕获,因为它的参数是一个整型值。

我们还可以定义一个catch 语句块来捕获所有的例外,不论扔出的是什么类型的参数。这种情况我们需要在catch 或面的括号中写三个点来代替原来的参数类型和名称,如:

   try {// code here}catch (...) {cout << "Exception occurred";}

try-catch 也是可以被嵌套使用的。在这种情况下,我们可以使用表达式throw;(不带参数)将里面的catch 语句块捕获的例外传递到外面一层,例如:

   try {try {// code here}catch (int n) {throw;}}catch (...) {cout << "Exception occurred";}

没有捕获的例外 (Exceptions not caught)

如果由于没有对应的类型,一个例外没有被任何catch 语句捕获,特殊函数terminate 将被调用。

这个函数通常已被定义了,以便立即结束当前的进程(process),并显示一个“非正常结束”( "Abnormal termination")的出错信息。它的格式是:

void terminate();

标准例外 (Standard exceptions)

一些C++ 标准语言库中的函数也会扔出一些列外,我们可以用try 语句来捕获它们。这些例外扔出的参数都是std::exception 引申出的子类类型的。这个类(std::exception) 被定义在C++ 标准头文件 中,用来作为exceptions标准结构的模型:

因为这是一个类结构,如果你包括了一个catch 语句块使用地址(reference)来捕获这个结构中的任意一种列外 (也就是说在类型后面加地址符 &),你同时可以捕获所有引申类的例外 (C++的继承原则)。

下面的例子中,一个类型为 bad_typeid 的例外(exception的引申类),在要求类型信息的对象为一个空指针的时候被捕获:

    // standard exceptions#include <iostream.h>#include <exception>#include <typeinfo>class A {virtual void f() {}; };int main () {try {A * a = NULL;typeid (*a);} catch (std::exception& e) {cout << "Exception: " << e.what();}return 0;}          
Exception: Attempted typeid of NULL pointer

C++ 高级篇(三)—— 出错处理相关推荐

  1. mysql高级篇三:常用sql技巧

    文章目录 SQL执行顺序 正则表达式使用 MySQL 常用函数 SQL执行顺序 编写顺序 SELECT DISTINCT<select list> FROM<left_table&g ...

  2. DataTable 深入解析数据源绑定原理之高级篇

    前言 在上篇写了篇 实战系列之天气预报实时采集 ,有个别同志认为没技术含量,也许正如所说. 只是人各有看法,当我写出一篇文章时,我只是希望: 1:如果你还不懂,请看写法,了解想法 2:如果你已懂,略过 ...

  3. 一起谈.NET技术,DataTable 深入解析数据源绑定原理之高级篇

    前言 在上篇写了篇 实战系列之天气预报实时采集 ,有个别同志认为没技术含量,也许正如所说. 只是人各有看法,当我写出一篇文章时,我只是希望: 1:如果你还不懂,请看写法,了解想法. 2:如果你已懂,略 ...

  4. 谷粒商城-个人笔记(高级篇二)

    目录 二.商城业务-首页 1.整合thymeleaf渲染首页 1).在"gulimall-product"项目中导入前端代码: 2).渲染一级分类数据&&整合dev ...

  5. 『高级篇』docker容器来说什么是微服务(三)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『高级篇』docker容器来说什么是微服务(三) 上一节说了单体架构,单体架构也无法适应我们的服务,来说说微服务,看能否解决单 ...

  6. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android高级篇下)...

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...

  7. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android高级篇上)...

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...

  8. PhotoShop算法实现高级篇--色彩特效(三十五)

    PhotoShop算法实现高级篇--色彩特效(三十五) kezunhai@gmail.com http://blog.csdn.net/kezunhai Photoshop中有很多色彩特效,本文介绍几 ...

  9. PhotoShop算法实现高级篇-剪纸艺术滤镜(三十二)

    PhotoShop算法实现高级篇-剪纸艺术滤镜(三十二) kezunhai@gmail.com http://blog.csdn.net/kezunhai 剪纸是中国古代乃至今日的传统艺术,它的团简单 ...

  10. python(三)之高级篇

    python之高级篇 一.文件操作 二.读写文本文件 三.读写二进制文件 四.读写JSON文件 五.异常详解 六.进程和线程 七.单进程与多进程 八.多线程编程 九.多进程还是多线程 十.reques ...

最新文章

  1. The expression cannot be a selector(occur after a dot)下面是 what went wrong: Execution failed for task
  2. asp.net实现在网页上自动显示超链接以及Email地址
  3. Elasticsearch CURL命令
  4. 火狐(FireFox)
  5. 工作236:点击直接进入
  6. 实验6 实践课程中的程序
  7. C#设计模式之5-单例模式
  8. 七种方式,教你在SpringBoot初始化时搞点事情!
  9. 博客园的博客中插入公式
  10. Oracle 11g RAC 修改IP
  11. [MySQL]SQL优化工具SQLAdvisor
  12. Python全栈工程实践
  13. 数据治理【数据安全管理】
  14. Revit SDK EXTENSIONS(软件开发工具包扩展)是什么
  15. 第六期 自定义IP添加-PWM 基于ARTY A7的MicroBlaze系统搭建与应用
  16. 计算机Excel怎么弄迷你图,excel怎么制作迷你图 excel迷你图的使用技巧
  17. matlab最炫名族风,matlab版 “最炫民族风” --- 跟风之作(附音频效果)(转)
  18. 搜索的剪枝——让爆搜变成“搜索”
  19. 办公室wifi信号因穿墙变弱了,该怎么办?
  20. dancer.js_与轻量级的Perl Web应用程序框架Dancer一起旋转

热门文章

  1. linux无法设置变量,linux – crontab在作业之前无法设置变量
  2. leetcode 129. 求根到叶子节点数字之和(先序遍历)
  3. c++飞扬的小鸟游戏_通过建立一个飞扬的鸟游戏来学习从头开始
  4. webpack 谷歌地图_如何在Webpack中设置可靠且可维护的Google Analytics(分析)
  5. 客户细分模型_Avarto金融解决方案的客户细分和监督学习模型
  6. python:当文件中出现特定字符串时执行robot用例
  7. Atcoder ARC101 E 树dp
  8. git忽略某个文件夹
  9. 参数依赖查找(ADL,Argument-dependent lookup)
  10. 使用BootStrap框架设置全局CSS样式