异常执行顺序(exception specification)
来源:互联网 发布:自行车锁哪种好 知乎 编辑:程序博客网 时间:2024/06/08 06:47
之前都没有好好练习过异常,也没有深入了解过,最近在看Thinking In C++中,它的第一章就讲述了大量的异常代码,本以为很简单,然而在机器上编译调试了一番,才发现并不是那么一回事。在执行下面的异常程序中,发现很有些特色(可能老手早就熟悉了),记录下来, 以便将来查看!程序源代码为:
// Exception specifications & unexcepted(),
//{-msc} (doesn't terminate properly)
#include <exception>
#include <iostream>
using namespace std;
class Up...{};
class Fit...{};
void g();
void f(int i) throw(Up,Fit)
...{
switch(i)
...{
case 1: throw Up();
case 2: throw Fit();
}
g();
}
// void g() {} //version 1
void g()
...{
throw 32;
}
void my_unexpected()
...{
cout<<" unexpected exception thrown"<<endl;
exit(0);
}
int main()
...{
set_unexpected(my_unexpected); // Ignores return value
for( int i=1; i<=3; i++)
try
...{
f(i);
}
catch(Up)
...{
cout<<"Up caught"<<endl;
}
catch(Fit)
...{
cout<<"Fit caught"<<endl;
}
return 0;
} /**////:~
整个程序结构非常简单,set_unexpected函数是exception头文件中提供的标准函数,用来设置抛出的异常没有列在异常规格说明(exception specification)的异常集中调用的unexpected函数(默认)
f 函数申明了异常规格说明集合,但调用了版本2的g 函数,而该函数抛出的异常却不在f 函数的异常规格说明集合中,因此将默认调用unexpected函数,此处将调用my_unexpected函数。
在VC中调试运行该函数,抛出出错对话框:
之后调试该程序,才惊奇的发现该程序运行顺序为
首先执行for语句,然后执行try块中的f 函数调用,之后抛出Up异常,跳转到catch(Up)语句处执行,输出Up caught后,跳转到return 0语句,之后再执行for语句,再一次循环,抛出Fit异常,return 0之后再运行for语句,抛出Debug Error 对话框!
原来异常程序的执行是如此的巧妙!
正如文中所说:把try块嵌入在for,while,do或if块中,并且触发异常来试图解决问题;然后重新测试try块中的代码!也就是说,即使其中一个执行过程抛出了异常,for,while,do或if等都能够继续执行下去,只针对其中一个过程产生影响,对全局影响并不是很大。
该程序在cygwin中可以被正确编译运行!说明了VC对标准C++的支持不是很好!
- 异常执行顺序(exception specification)
- 异常处理总结(二)- exception specification
- 异常处理总结(二)- exception specification
- c++异常说明(exception specification)
- Exception,finally,return执行顺序
- 异常执行的顺序
- javaSE异常执行顺序
- 异常的执行顺序
- C++ Exception Specification ignored
- try throw new Exception 执行顺序
- 异常处理的执行顺序
- 74_异常机制_try_catch_finally_return执行顺序
- C++程序抛出异常后执行顺序
- java异常语句的执行顺序
- 异常规范的警告(vs2005):warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
- Exception:DatePickerDialog和TimePickerDialog会执行两次的异常
- 初学 异常总结,异常finally执行顺序问题
- 异常(exception)
- huihoo和中国的开源,路在何方???
- 小评西安协同工作流新版v4.0功能
- css入门教程资料(1)
- css入门教程资料(2)
- 是愧疚,还是知识的进步
- 异常执行顺序(exception specification)
- css入门教程资料(3)
- css入门教程资料(4)
- 应用服务器连接池“续连接”及“回收”,切记,切记
- css入门教程资料(5)
- 过程建模EPC,我拿什么拯救你
- 数据质量研究综述
- c#访问修饰符
- 全局变量的用法