一、异常的基本概念
遇到错误 抛出异常 捕获异常
异常:(异常是一个类)是指在程序运行过程中发生的一些异常事件。(如:除0溢出、数组下标越界、所要读取的文件不存在、空指针、内存不足、访问非法内存等等)
c++异常处理 相比 c异常处理 的优势?(c用 返回值 处理异常,0成功,-1失败等等)
函数返回值可以忽略,但异常不可忽略。(忽略异常程序结束)
整型返回值没有任何语义信息。而异常却包含语义信息(类名)。
二、异常的抛出和捕获
没有catch(...)的话,如果没捕获到,系统退出
三、栈解旋
从进入try语句起,到异常被抛掷(throw)前这一期间,在栈上构造的所有对象,都会被自动析构,这一过程称为栈的解旋。
先构造再析构,析构和构造顺序相反。
四、异常的接口声明
异常的接口声明:描述 当前函数 可以抛些抛出哪些类型的异常。
1.(函数默认)可以抛出任何类型的异常(推荐)
void func01()
{
//throw 1;
//throw '1';
throw "hello";
}
2.只能抛出特定类型的异常
void func02() throw(int,char)
{
//throw 1;
//throw '1';
throw "hello";//抛出 不能捕获
}
3.不能抛出任何异常
void func03() throw()
{
//throw 1;
//throw '1';
throw "hello";
}
4.异常变量的生命周期
4.1 以普通对象 接异常值
4.2 以对象指针 接异常值
4.3 对象引用 接异常值(推荐)
五、异常的多态
多态是用虚函数完成的,父类指针存子类空间;
异常的多态 就是 抛出子类,捕获父类(引用),父类引用 可以捕获 该父类派生出的所有子类
六、c++标准异常
logic_error的子类
runtime_error的子类
exception是所有异常的祖先,一般正式开发中都直接用exception捕获,【what()是exception的一个虚函数,一定会有子类重写该函数】如下
六、编写自己的异常
编写自己的异常,一定要基于标准异常类,不能乱编
总结:
1.抛出异常 看看标准异常有哪些
2.捕获异常 都用 exception引用