#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)

C++异常处理(一) - iStack相关推荐

  1. C++异常处理机制详解

     异常处理是一种允许两个独立开发的程序组件在程序执行期间遇到程序不正常的情况(异常exception)时相互通信的机制.本文总结了19个C++异常处理中的常见问题,基本涵盖了一般C++程序开发所需 ...

  2. SpootBoot错误和异常处理机制及错误页指派+全局异常处理

    一:错误和异常 Error经常式程序无法处理的(用户引入的错误 和系统错误) Exception程序员引发的,能够在程序中处理(try catch / throws) 二:处理异常的方式 提供三种处理 ...

  3. Go语言的错误异常处理机制及其应用

    一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...

  4. SpringBoot (二) :全局异常处理设置

    说在前面 在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有 ...

  5. 2021年大数据常用语言Scala(三十四):scala高级用法 异常处理

    目录 异常处理 捕获异常 抛出异常 异常处理 Scala中 无需在方法上声明异常 来看看下面一段代码. def main(args: Array[String]): Unit = {val i = 1 ...

  6. Java基础(七)--Exception异常处理

    发现错误的理想时机是程序运行之前(编译期),然后不太现实,很多异常无法被发现(特别是业务上的数据),需要在运行时解决. 错误恢复机制保证代码健壮性的方式,异常处理在程序中很常见,也是必须的,必须考虑有 ...

  7. 零基础学习python_异常处理(32-33课)

    我们写完python执行的时候是不是经常会遇到报错,而且报错都是大片红字,这样给别人的感受就是你写的程序怎么老是出问题啊,这样我们还咋么混下去呢?于是乎,就有了异常处理的东东. python的try语 ...

  8. Spring Security 实战干货:自定义异常处理

    Spring Security 实战干货:自定义异常处理 转自:https://www.cnblogs.com/felordcn/p/12142514.html 文章目录 1. 前言 2. Sprin ...

  9. C++ 笔记(20)— 异常处理(抛出异常、捕获异常)

    异常提供了一种转移程序控制权的方式. C++ 异常处理涉及到三个关键字: try . catch . throw . throw : 当问题出现时,程序会抛出一个异常.这是通过使用 throw 关键字 ...

最新文章

  1. python快速编程入门例题-python编程入门知识练习
  2. Tabhost嵌套以及Tab中多个Activity跳转的实现
  3. junit4使用心得
  4. SQL Server 筛选时间区间
  5. spring----IOC知识点
  6. vijos 1083 小白逛公园
  7. 2020年5月十大热门报告盘点(附下载链接)
  8. 计算机网络6版,计算机网络教程(第6版)
  9. 博主自我介绍、当前已经成立的技术分局【专栏必读】
  10. 学计算机拼音不好怎么办,新学期拼音学不会怎么办?送你10个妙招攻克拼音难关...
  11. 图扑软件 | 数字孪生智慧选煤厂
  12. 抖音从流量上游杀入本地生活市场,美团如何“以牙还牙”?
  13. python文件或目录损坏且无法读取,data\sogoupy\verify.ini已损坏且无法读取,啥意思?谢谢?...
  14. 解决vue报错:Avoided redundant navigation to current location
  15. java特别描述错误的是,关于javac命令作用的描述错误的是
  16. jmeter 参数为邮箱@出现%40解决办法
  17. 阿里“小前台、大中台”的解读
  18. 量子计算(九):复合系统与联合测量
  19. office 365安装包下载
  20. 欧框语言框架标准C2,雅思成绩与欧洲语言共同参考框架的对应关系

热门文章

  1. 2019.7.22JS初始内容的整理以及4道题目
  2. HTML_DOM的node屬性
  3. bzoj1572 [Usaco2009 Open]工作安排Job
  4. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp
  5. 设计模式-缺省适配类.
  6. 打油诗 看《大上海》
  7. 【Centos配置2】远程管理必备工具配置:ssh/vnc/webadmin
  8. iText in Action 2nd5.2节(Events for basic building blocks)读书笔记
  9. dell设置从ssd启动_整个活儿:无损迁移系统到SSD过程记录及提升对比
  10. python 3.9 性能_Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型