• 异常执行顺序(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
    * 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
    * 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
  • 相关阅读:
    使用FolderBrowserDialog组件选择文件夹
    使用OpenFileDialog组件打开多个文
    使用OpenFileDialog组件打开对话框
    获取弹出对话框的相关返回值
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1137 Final Grading (25 分)
    PAT 甲级 1137 Final Grading (25 分)
  • 原文地址:https://www.cnblogs.com/ubunoon/p/2058921.html
Copyright © 2020-2023  润新知