异常处理
一、注意事项:
1、通过throw操作创建一个异常对象并抛掷
2、在需要捕捉异常的地方,将可能抛出的异常程序段嵌入try块之中
3、按正常程序顺序执行到try语句,然后执行try中的保护段
4、如果保护段中没有异常发生,那么后面的catch子句就不会执行,程序跟try后跟随最后一个catch后面的子句继续执行
5、catch子句按其在try块后出现的顺序被检查,匹配的catch子句将捕捉并按catch子句中的代码处理异常(或继续抛掷异常)
6、如果没有匹配到,则缺省功能是调用abort终止程序
注意:处理不了的异常,我们可以在catch的最后一个分支,只用throw语法,继续向调用者throw
二、异常接口声明
可以在函数声明列出可能抛出异常的类型,加强程序可读性
int copyfile2(char *dest, char *src) throw (float, string *, int)
1、对于异常接口的声明,在函数声明中列出可能抛出的所有异常类型
2、如果没有包含异常接口声明,此函数可能抛出任何异常
3、如果函数声明中列出可能抛出的所有异常类型,那么抛出其他异常类型,程序将会终止
4、如果一个函数不想抛出任何异常,可以用throw()声明
三、继承与异常
异常也是类,我们可以创建自己的异常类,在异常中可以使用(虚函数,派生,引用传递和数据成员等)
#include <iostream>
using namespace std;
/*
设计一个数组类容器 Vector,重载[]操作,数组初始化时,对数组的个数进行有效检查
1)index<0 抛出异常errNegativeException
2)index = 0 抛出异常 errZeroException
3)index>1000抛出异常errTooBigException
4)index<10 抛出异常errTooSmallException
5)errSizeException类是以上类的父类,实现有参数构造、并定义virtual void printError()输出错误。
*/
class errSizeException{
public:
errSizeException(int size){
m_size = size;
}
virtual void printError(){
cout<<"size: "<<m_size<<endl;
}
protected:
int m_size;
};
class errNegativeException : public errSizeException{
public:
errNegativeException(int size):errSizeException(size){
}
virtual void printError(){
cout<<"errNegativeException size: "<<m_size<<endl;
}
};
class errZeroException : public errSizeException{
public:
errZeroException(int size):errSizeException(size){
}
virtual void printError(){
cout<<"errZeroException size: "<<m_size<<endl;
}
};
class errTooBigException : public errSizeException{
public:
errTooBigException(int size):errSizeException(size){
}
virtual void printError(){
cout<<"errTooBigException size: "<<m_size<<endl;
}
};
class errTooSmallException : public errSizeException{
public:
errTooSmallException(int size):errSizeException(size){
}
virtual void printError(){
cout<<"errTooSmallException size: "<<m_size<<endl;
}
};
class Vector{
public:
Vector(int size = 128); //构造函数
int getLength();//获取内部储存的元素个数
int& operator[](int index);
~Vector();
private:
int *m_base;
int m_len;
};
Vector::Vector(int len){
if(len < 0){
throw errNegativeException(len);
}else if(len == 0){
throw errZeroException(len);
}else if(len > 1000){
throw errTooBigException(len);
}else if(len < 10){
throw errTooSmallException(len);
}
m_len = len;
m_base = new int[len];
}
Vector::~Vector(){
if(m_base) delete[] m_base;
m_len = 0;
}
int Vector::getLength(){
return m_len;
}
int &Vector::operator[](int index){
return m_base[index];
}
void main(){
try{
Vector v(10000);
for(int i=0; i<v.getLength(); i++){
v[i] = i+10;
printf("v[i]: %d\n", v[i]);
}
}catch(errSizeException &err){
err.printError();
}
/*catch(errNegativeException &err){
cout<<"errNegativeException..."<<endl;
}catch(errZeroException &err){
cout<<"errZeroException..."<<endl;
}catch(errTooBigException &err){
cout<<"errTooBigException..."<<endl;
}catch(errTooSmallException &err){
cout<<"errTooSmallException..."<<endl;
}*/
system("pause");
return ;
}
四、异常处理的基本思想
1、C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以再适当的位置设计对不同类型异常的处理
2、异常是专门针对抽象编程中的一系列错误进行处理的,C++中不能借助函数机制实现异常,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理的特征却是遇到错误信息就想要转到若干级之上进行重新尝试