C++异常处理(一) - iStack

本文介绍了一个使用C++实现的堆栈类,并详细展示了如何通过自定义异常类来处理栈空或栈满的情况。同时,文章还讨论了异常处理机制中的栈展开过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<string>
#include<vector>

using namespace std;

/**
1 要求一个pop()操作但栈却是空的
2 要求一个push()操作但栈却是满的
*/
/*定义一个异常类*/
class popOnEmpty { 
public:
    string info = string("Pop on empty!");
};
/*定义一个异常类*/
class pushOnFull { 
public:
    string info = string("Push on full!");
    /*这个异常类可以接收来自throw的参数value*/
    pushOnFull( int i ) : _value( i ) { }
    int value() { return _value; }
private:
    int _value;
};
/*编写一个堆栈类*/
class iStack {
public:
    /*构造函数*/
    iStack( int capacity )
            /*初始化参数列表*/
            : _stack( capacity ), _top( 0 ) { }
    /*出栈*/
    void pop( int &top_value );
    /*压入栈*/
    void push( int value );
    /*栈满*/
    bool full();
    /*栈空*/
    bool empty();
    /*显示栈数据*/
    void display();
    /*栈的大小*/
    int size();
private:
    /*栈顶*/
    int _top;
    /*栈空间数组*/
    vector< int > _stack;
};
/*出栈*/
void iStack::pop( int &top_value )
{
    if ( empty() )
        throw popOnEmpty();
    top_value = _stack[ --_top ];
    cout << "iStack::pop(): " << top_value << endl;
}
/*入栈*/
void iStack::push( int value )
{
    cout << "iStack::push( " << value << " ) \n";
    if ( full() )
        throw pushOnFull(value);
    _stack[ _top++ ] = value;
}
/*栈为空,*/
bool iStack::empty()
{
    return _top == 0 ? true:false;
}
/*栈为满*/
bool iStack::full()
{
    return _stack.size() == _top? true : false;
} 
/*显示一个栈*/
void iStack::display()
{
    for(auto i = _stack.begin(); i != _stack.end(); i++)
        cout<<*i<<"-";
    cout<<"\n";
}
/*主函数*/
int main(int argc, char *argv[])
{
    iStack stack(20);

    /*一个try 块引入一个局部域在try
      块内声明的变量不能在try 块外被引用*/
    try {
        for ( int ix = 1; ix < 501; ++ix )
        {
            if ( ix % 3 == 0 )
                stack.push( ix );
            if ( ix % 4 == 0 )
                stack.display();
            if ( ix % 10 == 0 ) {
                int dummy;
                stack.pop( dummy );
                stack.display();
            }
        }
    }
    /*
    1.如果这些catch 子句不包含返回语句那么程序的执行将继续到哪儿呢在catch 子句完
        成它的工作之后程序的执行将在catch 子句列表的最后子句之后继续进行.
    2.catch 子句被检查的顺序与它们在try 块之后出现的顺序相同
    */
    catch(...){//catch所有异常
        cout<<"catch(...)"<<endl;
        try{
            throw;
        }
        catch ( pushOnFull &e) { 
            cout<<e.info<<e.value()<<endl; 
            try{
                //被重新抛出的异常就是原来的异常对象
                throw;
            }catch ( pushOnFull &e) { cout<<"Twice: "<<e.info<<endl; }
        }
        //这里的e用throw异常的拷贝进行初始化
        //为了防止不必要地拷贝大型类对象class 类型的参数应该被声明为引用
        catch ( popOnEmpty &e) { cout<<e.info<<endl; }
    }
    
    return 1;
}
/**
 *  栈展开stack unwinding:
 *  在查找用来处理被抛出异常的catch 子句时因为异常而退出复合语句和函数定义这
 *   个过程被称作栈展开stack unwinding
 * 本程序中,栈展开: throw -> pop() -> main()
 */

编译运行:

$ g++ Demo.cpp
$ ./a.exe
iStack::push( 3 )
3-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 6 )
3-6-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 9 )
iStack::pop(): 9
3-6-9-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 12 )
3-6-12-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 15 )
3-6-12-15-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 18 )
3-6-12-15-18-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::pop(): 18
3-6-12-15-18-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 21 )
iStack::push( 24 )
3-6-12-15-21-24-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 27 )
3-6-12-15-21-24-27-0-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 30 )
iStack::pop(): 30
3-6-12-15-21-24-27-30-0-0-0-0-0-0-0-0-0-0-0-0-
3-6-12-15-21-24-27-30-0-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 33 )
iStack::push( 36 )
3-6-12-15-21-24-27-33-36-0-0-0-0-0-0-0-0-0-0-0-
iStack::push( 39 )
3-6-12-15-21-24-27-33-36-39-0-0-0-0-0-0-0-0-0-0-
iStack::pop(): 39
3-6-12-15-21-24-27-33-36-39-0-0-0-0-0-0-0-0-0-0-
iStack::push( 42 )
3-6-12-15-21-24-27-33-36-42-0-0-0-0-0-0-0-0-0-0-
iStack::push( 45 )
iStack::push( 48 )
3-6-12-15-21-24-27-33-36-42-45-48-0-0-0-0-0-0-0-0-
iStack::pop(): 48
3-6-12-15-21-24-27-33-36-42-45-48-0-0-0-0-0-0-0-0-
iStack::push( 51 )
3-6-12-15-21-24-27-33-36-42-45-51-0-0-0-0-0-0-0-0-
iStack::push( 54 )
3-6-12-15-21-24-27-33-36-42-45-51-54-0-0-0-0-0-0-0-
iStack::push( 57 )
iStack::push( 60 )
3-6-12-15-21-24-27-33-36-42-45-51-54-57-60-0-0-0-0-0-
iStack::pop(): 60
3-6-12-15-21-24-27-33-36-42-45-51-54-57-60-0-0-0-0-0-
iStack::push( 63 )
3-6-12-15-21-24-27-33-36-42-45-51-54-57-63-0-0-0-0-0-
iStack::push( 66 )
3-6-12-15-21-24-27-33-36-42-45-51-54-57-63-66-0-0-0-0-
iStack::push( 69 )
iStack::pop(): 69
3-6-12-15-21-24-27-33-36-42-45-51-54-57-63-66-69-0-0-0-
iStack::push( 72 )
3-6-12-15-21-24-27-33-36-42-45-51-54-57-63-66-72-0-0-0-
iStack::push( 75 )
3-6-12-15-21-24-27-33-36-42-45-51-54-57-63-66-72-75-0-0-
iStack::push( 78 )
3-6-12-15-21-24-27-33-36-42-45-51-54-57-63-66-72-75-78-0-
iStack::pop(): 78
3-6-12-15-21-24-27-33-36-42-45-51-54-57-63-66-72-75-78-0-
iStack::push( 81 )
iStack::push( 84 )
3-6-12-15-21-24-27-33-36-42-45-51-54-57-63-66-72-75-81-84-
iStack::push( 87 )
catch(...)
Push on full!87
Twice: Push on full!

另外,对于异常规范,C++11已经弃用动态异常规范,例如:

/*编写一个堆栈类*/
class iStack {
public:
    /*构造函数*/
    iStack( int capacity )
            /*初始化参数列表*/
            : _stack( capacity ), _top( 0 ) { }
    /*出栈*/
    void pop( int &top_value ) throw (popOnEmpty);
    /*压入栈*/
    void push( int value ) throw (pushOnFull);
    /*栈满*/
    bool full();
    /*栈空*/
    bool empty();
    /*显示栈数据*/
    void display();
    /*栈的大小*/
    int size();
private:
    /*栈顶*/
    int _top;
    /*栈空间数组*/
    vector< int > _stack;
};
/*出栈*/
//动态异常规范已弃用
void iStack::pop( int &top_value ) throw (popOnEmpty)
{
    if ( empty() )
        throw popOnEmpty();
    top_value = _stack[ --_top ];
    cout << "iStack::pop(): " << top_value << endl;
}
/*入栈*/
void iStack::push( int value )throw (pushOnFull)
{
    cout << "iStack::push( " << value << " ) \n";
    if ( full() )
        throw pushOnFull(value);
    _stack[ _top++ ] = value;
}

在编译过程中提示:

$ g++ Demo.cpp
Demo.cpp:35:32: 警告:dynamic exception specifications are deprecated in C++11  -Wdeprecated]
     void pop( int &top_value ) throw (popOnEmpty);     动态异常规范已弃用
                                ^~~~~
Demo.cpp:37:28: 警告:dynamic exception specifications are deprecated in C++11  -Wdeprecated]
     void push( int value ) throw (pushOnFull);
                            ^~~~~
Demo.cpp:54:36: 警告:dynamic exception specifications are deprecated in C++11  -Wdeprecated]
 void iStack::pop( int &top_value ) throw (popOnEmpty)
                                    ^~~~~
Demo.cpp:62:31: 警告:dynamic exception specifications are deprecated in C++11  -Wdeprecated]
 void iStack::push( int value )throw (pushOnFull)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值