第十七章 用于大型程序的工具(异常处理)

原创 2011年02月11日 11:34:00

 

17.1 异常处理

1) 抛出的异常如果是函数体中的局部变量的指针,那么当处理异常在另一个函数的时候,指针就不存在了

 

2) 当找到匹配的catch之后,就在与该try相关的最后一个catch之后面的代码继续程序

 

3) 析构函数应该从不抛出异常,如果在抛出异常中,再因为析构函数而抛出异常,那么会调用terminate()函数继而运行abort()函数,强制退出.

 

4) 如果不捕获这个异常,那么将调用terminate()

 

5) catch中可以throw;将原来的异常对象重新抛出

 

6) catch(…)捕获所有的异常

 

7) 构造函数的测试块

template <class T> Handle<T>::Handle(T* p)

try: ptr(p),use(new size_t(1))

{}

catch (const std::bad_alloc &e)

{

handle_out_of_memory(e);

}

 

8) 使用类来管理那些资源,可以保证在发生异常的时候可以释放资源

例子:

f()

{

         int *a=new int[1000];

         //如果这中间发生了异常就悲剧了

         delete []a;

}

 

class A

{

         f()

{

         p=new int[1000];

         //就算这个时候发生异常,当退出这个类的作用域的时候,会自动调用析构函数,释放资源

         delete p;

}

};

 

9) 异常类的继承表

10) auto_ptr

a.作用

f()

{

auto_ptr<int> ap(new int (1024));

         //当出现错误,在跳出f()的时候,ap能自动析构

}

b.使用方式

和正常指针一样*ap 或者ap->……..

判断指针是否为空的时候应用if(ap.get())

初始化或重置的时候应用ap.reset(new int (2313));//当然也可以ap.reset(0);

 

c.赋值和对象复制的时候将出现绑定转移

auto_ptr<int> ap1(new int (1024));

auto_ptr<int> ap2(ap1);//这个时候ap1不指向任何对象

auto_ptr<int> ap3(new int (1024));

ap2=ap3;//先删除ap2指向的对象,ap2指向ap3指向的对象,ap3没有指向对象

 

d.使用的时候的注意事项

不能与容器类兼容(容器类需要复制)

不能保存数组的指针(当删除的时候默认是delete,而没有delete[])

不能保存静态成员的指针

多个 ap不能指向同一个指针

 

11) 异常说明

a.类型

void f(int) throw (runtime_error);//f()只能抛出runtime_error类或者其继承类的异常

void f1(int) throw();//f1()不能抛出异常

void f2(int);//f2()能抛出任何异常

 

b.违反了规定的时候将抛出unexcepted异常导致退出

 

c.派生类的异常说明比基类的异常说明严格

 

d.函数指针的异常说明

void f(int) throw (runtime_error);

void (*fp1)(int) throw(runtime_error)=f;//ok

void (*fp2)(int) throw()=f;//ok

void (*fp3)(int) =f;//错了,应该更加严格才对

 

12) 一个很简单的异常处理的例子

摘自百度百科http://baike.baidu.com/view/1072586.htm

 

 

 

 

 

 

 

用于大型程序的工具

都是非常好的东西,非大型程序用了也很好啊
  • u013573183
  • u013573183
  • 2014-06-27 13:22:00
  • 280

C++ Primer 学习笔记_87_用于大型程序的工具 -错误处理

用于大型程序的工具 --异常处理 引言: C++语言包含的一些特征在问题比较复杂,非个人所能管理时最为有用。如:异常处理、命名空间和多重继承。 相对于小的程序员团队所能开发的系统需求而...
  • u011744843
  • u011744843
  • 2016-05-10 20:26:14
  • 579

【C++ Primer】第17章 用于大型程序的工具

第17章 用于大型程序的工具 异常处理 当抛出一个表达式的时候,被抛出对象的静态编译时类型将决定异常对象的类型。如果抛出一个指向派生类对象的积累指针,该对象会被分割,只抛出基类部分 抛出指向局部对象的...
  • hellokangning
  • hellokangning
  • 2013-08-02 18:25:52
  • 439

大型项目里是如何进行log处理,和异常处理

面试时,问我大型项目中log处理,和异常处理我做的项目没有涉及到这些,所以想问问大型项目里是如何进行log处理,和异常处理有否这方面的资料和书籍,谢谢大家我们做的一个200多万的项目,不知道是不是算大...
  • flyly88
  • flyly88
  • 2010-11-09 22:04:00
  • 353

C++ Primer 4 第十七章 用于大型程序的工具

第十七章 用于大型程序的工具 1. 异常处理 异常是通过抛出对象而引发的。该对象的类型决定应该激活哪个处理代码。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个. 执行 thr...
  • peace_power
  • peace_power
  • 2012-02-29 17:32:26
  • 332

S18用于大型程序的工具

C++primer S18
  • jasonyuchen
  • jasonyuchen
  • 2017-12-17 10:45:34
  • 121

18-用于大型程序的工具

用于大型程序的工具 大规模程序设计的要求: 1.在独立开发的子系统协同处理错误的能力 2.使用各种库进行协同开发的能力; 3.对比较复杂的应用概念进行协同开发的能力; 异常处理,命名空间和多重继承;...
  • qq_36294875
  • qq_36294875
  • 2017-09-23 10:06:52
  • 70

JavaScript权威指南_157_第17章_事件处理_17.0-概述

  • wuqinfei_cs
  • wuqinfei_cs
  • 2015-09-13 11:17:06
  • 1181

C++ Primer Plus第六版 第十七章 编程练习答案(完结篇...木有18章)

前前后后这本书也看了有很长时间了,当初刚拿到这本书的时候:卧槽 800多页 这么厚怎么可能看完。 然后一点点读一点点啃,也总算把这本书啃完了。当然 这本书读完,C++也未必能算入门,还需要后续不断的...
  • zhaoshu01234
  • zhaoshu01234
  • 2015-12-12 09:50:10
  • 1319

《C++Primer》3.21 用于大型程序的工具

异常处理:执行throw时,不会执行跟在throw后面的语句,而是将控制从throw转移到匹配的catch,该catch可以是同一函数中局部的catch,也可以在直接或间接调用发生异常的函数的另一个函...
  • wojiaopanpan
  • wojiaopanpan
  • 2012-03-21 17:04:22
  • 379
收藏助手
不良信息举报
您举报文章:第十七章 用于大型程序的工具(异常处理)
举报原因:
原因补充:

(最多只允许输入30个字)