外传二 函数的异常规格说明

如何判断一个函数是否会抛出异常,以及抛出哪些异常?

如果是第三方库函数我们看不到实现,只能看到声明,如何判断是否会抛出异常呢?

解决方案:

问题:

如果抛出的异常不在异常规格列表中,会发生什么?

示例:

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 void func() throw(int)
 6 {
 7     cout << "func()";
 8     cout << endl;
 9
10     throw ‘c‘;
11 }
12
13
14
15 int main()
16 {
17     try
18     {
19         func();
20     }
21     catch(int)
22     {
23         cout << "catch(int)";
24         cout << endl;
25     }
26     catch(char)
27     {
28         cout << "catch(char)";
29         cout << endl;
30     }
31
32     return 0;
33 }

bcc结果如下:

linux结果如下:

vs2010结果如下:

vs中的处理方式是,抛出的异常被26行捕获处理了。

三款编译器的行为不一样。

vs编译器在这里没有支持标准C++的行为。

自定义unexpected函数:

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <exception>
 4
 5 using namespace std;
 6
 7 void my_unexpected()
 8 {
 9     cout << "void my_unexpected()" << endl;
10     exit(1);
11     12 }
13
14 void func() throw(int)
15 {
16     cout << "func()";
17     cout << endl;
18
19     throw ‘c‘;
20 }
21
22 int main()
23 {
24     set_unexpected(my_unexpected);
25
26     try
27     {
28         func();
29     }
30     catch(int)
31     {
32         cout << "catch(int)";
33         cout << endl;
34     }
35     catch(char)
36     {
37         cout << "catch(char)";
38         cout << endl;
39     }
40
41     return 0;
42 }

结果如下:

linux:

bcc:

vs2010:

可以看到vs还是不遵循规范,还是按原来的方式处理。

更改程序如下:

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <exception>
 4
 5 using namespace std;
 6
 7 void my_unexpected()
 8 {
 9     cout << "void my_unexpected()" << endl;
10     // exit(1);
11     throw 1;
12 }
13
14 void func() throw(int)
15 {
16     cout << "func()";
17     cout << endl;
18
19     throw ‘c‘;
20 }
21
22 int main()
23 {
24     set_unexpected(my_unexpected);
25
26     try
27     {
28         func();
29     }
30     catch(int)
31     {
32         cout << "catch(int)";
33         cout << endl;
34     }
35     catch(char)
36     {
37         cout << "catch(char)";
38         cout << endl;
39     }
40
41     return 0;
42 }

结果:

linux:

在第7行的函数中,打印之后,又扔出int异常,这个异常和func的异常规格兼容,相当于func扔出了int异常,于是被第30行捕获处理。

bcc:

vs2010:

可见vs依然按照原来的方式处理。

小结:

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9607306.html

时间: 2024-07-30 05:38:51

外传二 函数的异常规格说明的相关文章

外传篇2 函数的异常规格说明

1. 函数的异常规格说明 (1)C++提供语法用于声明函数所抛出的异常 (2)异常声明作为函数声明的修饰符,写在参数列表后面 //可能抛出任何异常 void func1(); //只能抛出的异常类型:char和int void func2() throw(char, int); //不抛出任何异常 void func3() throw(); //自定义结束函数 void my_terminate() 2. 异常规格说明的意义 (1)提示函数调用者必须做好异常处理的准备 (2)提示函数维护者不要抛

Lua进阶(二)——函数环境、包

函数环境 function foo() print(g or "No g defined!") end foo() setfenv(foo, { g = 100, print = print }) --设置foo的环境为表{ g=100, ...} foo() print(g or "No g defined!") --No g defined! --100 --No g defined! 定义:函数环境就是函数在执行时所见的全局变量的集合,以一个表来承载. 说明:

二 函数对象、函数嵌套

一 函数对象 一.函数是第一类对象,即函数可以当作数据传递 二.利用该特性,优雅的取代多分支的if 二 函数嵌套 一.函数的嵌套调用 二.函数的嵌套定义 一 函数对象 一.函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二.利用该特性,优雅的取代多分支的if 1 def foo(): 2 print('foo') 3 4 def bar(): 5 print('bar') 6 7 dic={ 8 'foo'

python学习笔记(二) - 函数

一. 调用函数 python内置了一些数据类型转换函数,比如int()函数可以把其他数据类型转换为整形 >>> int('123') 123 >>> int(12.34) 12 >>> float('12.34') 12.34 >>> str(1.23) '1.23' >>> unicode(100) u'100' >>> bool(1) True >>> bool('') Fal

Python学习笔记总结(二)函数和模块

一.函数 函数的作用:可以计算出一个返回值,最大化代码重用,最小化代码冗余,流程的分解. 1.函数相关的语句和表达式 语句        例子 Calls        myfunc(‘diege','eggs',meat=‘lit’) #使用函数 def,return,yield      def adder(a,b=1,*c):                        return a+b+c[0] global        changer():                 gl

Scala基础02:函数,异常

函数的默认参数 例: def decorate(str: String, left: String = “[”, right: String = “]”) = left + str + right 无参函数的调用可以不使用括号.但默认参数不代表没有参数.对于所有参数都是默认参数的函数,其调用必须使用括号. 例: def helloSpark(name:String = “Spark”){ println(name) } 调用该函数: helloSpark 错误 helloSpark() 正确 h

nodejs中处理回调函数的异常

假设是使用nodejs+express3这个经典的组合.那么有一种非常方面的处理回调函数异常的方法: 1. 安装模块:express-domain-middleware 2. 增加例如以下的代码: app.use(require('express-domain-middleware')); app.use(function errorHandler(err, req, res, next) { logger.error('error on request %d %s %s: %j', proce

【C++】模板简述(二):函数模板

我们上文讲了,模板的引入,我们发现在某种特殊的情况下,必须得通过模板才能完美的解决问题. 本文就来简述一下函数模板的基本使用. 一.函数模板格式 template<typename Param1, typename Param2,...,class Paramn> 返回值类型 函数名(参数列表){ ... } 二.函数模板的实例 //T表示类型,具体是什么不知道,实例化的时候才知道 //typename可以用class代替,但推荐使用typename //注意:typename不能用struc

php深入学习笔记二( 函数内置函数 )

1. call_?user_?func_?array 调用用户自定义函数,第一个参数是函数名, 第二个参数是函数的参数 必须是是一索引数组 function foobar($arg, $arg2) { echo __FUNCTION__, " got $arg and $arg2\n"; } class foo { function bar($arg, $arg2) { echo __METHOD__, " got $arg and $arg2\n"; } } //