C++异常知识点整理

一、类型的转换

1、static_cast<T>(expr) 为强制类型转换,

用于基本类型之间的转换,但不能用于基本类型指针之 间的转换,也可以用于有继承关系类对象和类指针之间的转换

eg. 

是在编译器进行转换的,无法在运行时检测类型,所以类类型之间的转换可能存在风险

2、reinterpret_cast<T>(expr)为强制类型转换,

用于指针类型间得强制转换,用于整数和指针类型间的强制转换

reinterpret_cast直接从二进制位进行复制,是一种极其不安全的转换

3、dynamic_cast<T>(expr) 为强制类型转换,

用于类层次间的转换,还可以用于累之间的交叉转换,dynamic_cast具有类型检查的功能,比static_cast安全

 

4、const_cast为强制类型转换

用于出去变量的const的属性

 

二、异常

1.什么是异常?

1)异常是一种程序控制机制,与函数机制独立和互补
    函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作为网捕条件,从而以类型匹配在栈机制中跳跃回馈.
2)异常设计目的:
    栈机制是一种高度节律性控制机制,面向对象编程却要求对象之间有方向、有目的的控制传动,从一开始,异常就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题,而不是仅为了进行错误处理。
异常设计出来之后,却发现在错误处理方面获得了最大的好处。

2.异常的基本语法



2) 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
3) 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。
4) catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
5) 如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。
6)处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。
7)异常机制与函数机制互不干涉,但捕捉的方式是基于类型匹配。捕捉相当于函数返回类型的匹配,而不是函数参数的匹配,所以捕捉不用考虑一个抛掷中的多种数据类型匹配问题
 8)异常捕捉严格按照类型匹配
异常捕捉的类型匹配之苛刻程度可以和模板的类型匹配媲美,它不允许相容类型的隐式转换,比如,抛掷char类型用int型就捕捉不到
 
构造函数没有返回类型,无法通过返回值来报告运行状态,所以只通过一种非函数机制的途径,即异常机制,来解决构造函数的出错问题。
 

// 1、异常可以跨函数
// 2、异常变量如果不处理,默认的操作的是终止程序运行
// 3、捕捉到异常以后,可以处理,也可以不处理  可以通过 throw 将异常变量继续抛出
// 4、异常变量的捕捉要严格遵守类型匹配机制,不允许进行隐式的转换

3、异常的处理思想


 


1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以再适当的位置设计对不同类型异常的处理。
2)异常是专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机制,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理的特征却是遇到错误信息就想要转到若干级之上进行重新尝试,如图

3)异常超脱于函数机制,决定了其对函数的跨越式回跳。
4)异常跨越函数
 
 4.栈解旋

    异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋(unwinding)。
 5.异常的接口声明

1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型,例如:
    void func() throw (A, B, C , D); //这个函数func()能够且只能抛出类型A B C D及其子类型的异常。
2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:
    void func();
3)一个不抛掷任何类型异常的函数可以声明为:
    void func()  throw();
4) 如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数中止程序。
 
6.异常类型和异常变量的生命周期

1)throw的异常是有类型的,可以使,数字、字符串、类对象。
2)throw的异常是有类型的,catch严格按照类型进行匹配。
3)注意 异常对象的内存模型  。


 7.异常的层次结构(继承在异常中的应用)

异常是类 – 创建自己的异常类
异常派生
异常中的数据:数据成员
按引用传递异常
在异常中使用虚函数
案例:设计一个数组类 MyArray,重载[]操作,
数组初始化时,对数组的个数进行有效检查 
index<0 抛出异常eNegative  
index = 0 抛出异常 eZero  
    3)index>1000抛出异常eTooBig 
    4)index<10 抛出异常eTooSmall 
    5)eSize类是以上类的父类,实现有参数构造、并定义virtual void printErr()输出错误。
 

8.标准库异常