zoukankan      html  css  js  c++  java
  • 异常执行顺序(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++的支持不是很好!

    /*
    *
    * Copyright (c) 2011 Ubunoon.
    * All rights reserved.
    *
    * email: netubu#gmail.com replace '#' to '@'
    * http://www.cnblogs.com/ubunoon
    * 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
    * 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
  • 相关阅读:
    LED自动同步时钟(LED电子时钟系统)京准电子
    电力北斗对时装置(北斗时钟同步系统)详细介绍
    京准时间同步系统(NTP网络同步时钟)概述
    京准:NTP时钟服务器(NTP时钟服务器)研究分析
    医院时钟系统(子母钟系统)设计组成架构
    GPS校时器(北斗授时设备)助力政务云建设
    三大免费开源的php语言cms系统 用好它们让你一天建好一个网站
    想精通正则表达式 这几个正则表达式学习资料及工具你必须有!
    零基础建站如何配置PHP运行环境 几种服务器环境配置的选择和方法
    php代码如何加域名授权?开源php项目如何保护版权 商业授权?
  • 原文地址:https://www.cnblogs.com/ubunoon/p/2058921.html
Copyright © 2011-2022 走看看