异常执行顺序(exception specification)

之前都没有好好练习过异常,也没有深入了解过,最近在看Thinking In C++中,它的第一章就讲述了大量的异常代码,本以为很简单,然而在机器上编译调试了一番,才发现并不是那么一回事。在执行下面的异常程序中,发现很有些特色(可能老手早就熟悉了),记录下来, 以便将来查看!程序源代码为:

// : C01: Unexpcected.cpp

//  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 1throw Up();
    
case 2throw 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
    forint 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++的支持不是很好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值