1,本文介绍一个新的概念,它是一个重要的概念,并且是 C++ 中的一个高级主题;

2,问题:

1,如何判断一个函数(不是自己写的,有可能是第三方库中的函数)是否会抛出异常,以及抛出那些异常?

1,学习了异常处理,我们在调用一个函数的时候,就应该知道这个函数会不会抛出异常,如果会,抛那些:

2,如果是第三方库的函数,只有函数声明,没有函数实现,则也不知道会不会抛出异常;

3,查看函数文档也是不错的方法,但是如果手头文档和真实的库的版本不匹配,有可能查到的东西就是不准确的;

3,异常规格说明:

1,C++ 提供语法用于声明函数所抛出的异常;

2,异常声明作为函数声明的修饰符,写在参数列表后面:

1,/* 可能抛出任何异常 */

void func1();

/* 只能抛出的异常类型:char 和 int */

void func2() throw(char, int);

/* 不抛出任何异常 */

void func3() throw();

4,异常规格说明的意义:

1,提示函数调用者必须做好异常处理的准备;

1,如果想知道调用的函数会抛出哪些类型的异常时,只用打开头文件看看这个函数是怎么声明的就可以了;

2,提示函数的维护者不要抛出其它异常;

3,异常规格说明是函数接口的一部分;

1,用于说明这个函数如何正确的使用;

5,如果抛出的异常不在声明列表中,会发生什么?

6,下面的代码输出什么?

7,异常规格之外的异常编程实验:

 #include <iostream>

 using namespace std;

 void func() throw(int)
{
cout << "func()";
cout << endl; throw 'c';
} int main()
{
try
{
func();
}
catch(int)
{
cout << "catch(int)";
cout << endl;
}
catch(char)
{
cout << "catch(char)";
cout << endl;
} return ;
}

1,BCC 显示:

1,func()

Abnormal program termination

2,g++ 显示:

1,terminate called after throwing an instance of 'char'

2,已放弃

3,VC 2010 显示:

1,func()

2,catch(char)

8,unexpected() 函数说明:

1,函数抛出的异常不在规格说明中,全局 unexpected() 被调用;

2,默认的 unexpected() 函数会调用全局的 terminate() 函数;

1,这是 BCC 和 g++ 编译器的行为;

3,可以自定义函数替换默认的 unexpected() 函数实现;

1,VC 2010 编译器的也不遵循行为;

4,注意:不是所有的 C++ 编译器都支持这个标准行为;

1,在异常处理这个技术点上面,编译器实现是有差异的,如果我们未来的项目中确实的要用到函数的异常规格说明时,我们最好的写一个小的测试程序,看看当前项目里面所使用的 C++ 编译器在这一个技术点的行为是怎样的,有没有遵循标准的 C++ 规范;

9,unexpected() 函数的替换:

1,自定义一个无返回值无参数的函数:

1,能够再次抛出异常:

1,当异常符合触发函数的异常规格说明时,恢复程序执行;

1,见 本文10 中程序 throw 1;

2,否则,调用全局 terminate() 函数结束程序;

2,调用 set_unexpected() 设置自定义的异常函数:

1,参数类型为 void(*)();

2,返回值为默认的 unexpected() 函数入口地址;

10,自定义 unexpected() 函数编程实验:

 #include <iostream>
#include <cstdlib>
#include <exception> using namespace std; void my_unexpected()
{
cout << "void my_unexpected()" << endl;
// exit(1); // 退出;
throw ;
} void func() throw(int)
{
cout << "func()";
cout << endl; throw 'c';
} int main()
{
set_unexpected(my_unexpected); try
{
func();
}
catch(int)
{
cout << "catch(int)";
cout << endl;
}
catch(char)
{
cout << "catch(char)";
cout << endl;
} return ;
}

1,exit(1) 结果:

1,g++ 编译器:

func()

void my_unexpected()

2,BCC 编译器:

func()

void my_unexpected()

3,VC 2010 编译器:

func()

catch(char)  // 未有遵循标准 C++ 规范;

2,throw 1 结果:

1,g++ 编译器:

func()

void my_unexpected()

catch(int)  //与触发函数 func() 的异常规格符合,于是程序恢复执行;

2,BCC 编译器:

func()

void my_unexpected()

catch(int)

3,VC 2010 编译器:

func()

catch(char)  // 未有遵循标准 C++ 规范,直接捕获,然后处理;

3,如果以后项目开发,会使用函数异常说明这个技术点,最好在项目开发前写一些小程序测试下当前使用的 C++ 编译器有没有很好的遵循 C++ 的规范;

11,小结:

1,C++ 中的函数可以声明异常规则说明;

2,异常规格说明可以看作接口的一部分;

3,函数抛出的异常不在规格说明中,unexpected() 被调用;

4,unexpected() 中能够再次抛出异常;

1,异常能够匹配,恢复程序的执行;

2,否则,调用 terminate() 结束程序;

3,un_expected() 函数是正确处理异常的最后机会,如果没有抓住,terminate() 函数会被调用,当前程序以异常告终;

C++中函数异常规格的说明的更多相关文章

  1. PHP程序员函数注释规格(麻烦大家遵守)

    PHP程序员函数注释规格(麻烦大家遵守)   以前我也不愿意写注释,但是2个月后发现自己写的什么都不知道了.. 为了宇宙的发展,为了二次开发的便捷,为了代码的可读性,建议大家把注释写好.. <? ...

  2. Erlang类型及函数声明规格

    http://erlangdisplay.iteye.com/blog/404570 Erlang类型及函数声明规格 Author: Mail: Date: Copyright: litaocheng ...

  3. PHP中Exception异常

    异常的基本使用 当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块. 如果异常没有被捕获,而且又没用使用 set_exception_hand ...

  4. 【Java心得总结二】浅谈Java中的异常

    作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...

  5. python虚拟机中的异常流控制

    异常:对程序运行中的非正常情况进行抽象.并且提供相应的语法结构和语义元素,使得程序员能够通过这些语法结构和语义元素来方便地描述异常发生时的行为. 1.Python中的异常机制: 1.1Python虚拟 ...

  6. Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  7. Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...

  8. [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)

    无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...

  9. C++中的异常

    一,异常的推演 1.函数与异常 平时我们在函数中出现异常情况时通常通过return终止函数并返回一个值,然后在函数上层来获取值并判断是什么异常情况.因为函数是栈结构的,所以return的时候是通过栈结 ...

随机推荐

  1. ueditor+复制word+图片不能上传

    最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...

  2. VUE里面的$(this)

    我们很多时候需要用到列表点击其中的某个有相对的事件发生,那就拿用到$(this),但是在vue里面,直接写$(this)获取不到指定的元素,所以我就用的下面这种写法 <div v-for=&qu ...

  3. python爬取智联招聘职位信息(多进程)

    测试了下,采用单进程爬取5000条数据大概需要22分钟,速度太慢了点.我们把脚本改进下,采用多进程. 首先获取所有要爬取的URL,在这里不建议使用集合,字典或列表的数据类型来保存这些URL,因为数据量 ...

  4. source和resource的区别

    idea中,有时新导入的工程会出现 类的标识为红色的J,此时为无效,并且该类不能被编译,这是因为该类所在的文件夹java没有被标记为Sources Root,而放置配置文件的resources文件夹没 ...

  5. 51nod-1640--天气晴朗的魔法(简单最小生成树)

    1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 这样阴沉的天气持续下去,我们不免担心起他的健康. 51nod魔法学校近日 ...

  6. gulp自动化构建工具安装使用(1)

    我用的是windows,所以以下操作针对于windows用户,其他系统有不一样的地方请自行查阅资料更正. 好了,废话少说,反正也就是随手捣腾.下雨了,天晴了,我们开始搞gulp了 安装:gulp是个构 ...

  7. 事件源event.target

    今天在了解检测浏览器是否能播放不同类型的视频时发现以下代码 <script> function supportType(e,vidType,codType) { myVid=documen ...

  8. Android Context介绍

    转载(Android Context完全解析与各种获取Context方法):https://www.cnblogs.com/chenxibobo/p/6136693.html

  9. 【Spark机器学习速成宝典】模型篇07梯度提升树【Gradient-Boosted Trees】(Python版)

    目录 梯度提升树原理 梯度提升树代码(Spark Python) 梯度提升树原理 待续... 返回目录 梯度提升树代码(Spark Python) 代码里数据:https://pan.baidu.co ...

  10. JSP——指令(Directive)

    指令是一种JSP句法元素,它告诉JSP转换器应该如何将某个JSP页面转换成Servlet. JSP 2.2中定义了几个指令:page.include.taglib.tag.attribute以及var ...