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
    * 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
    * 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
  • 相关阅读:
    kafka-python基本使用
    RabbitMq 消息队列详解
    Socket 编程
    python 进程, 线程 ,协程,锁,协程应用到爬虫的讲解
    python中with的用法
    为什么 Elasticsearch 需要堆内存来存储数据
    面向数据的架构
    跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)
    跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)
    跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)
  • 原文地址:https://www.cnblogs.com/ubunoon/p/2058921.html
Copyright © 2011-2022 走看看