今天我们来说下异常处理。
异常处理的基本语法:
try{
复合语句
}
catch(异常类型声明)
复合语句
catch(类型(形参))
复合语句
有这样一个案例:
设计一个数组类Myarray,重载[]操作
数据初始化时,对数据的个数进行有效的检查
1)index<0,抛出异常eNegative
2)index=0 抛出异常eZero
3)index>1000 抛出异常eTooBig
4)index<10 抛出异常 eTooSmall
5)eSize是以上类的父类,实现有参数构造,并定义virtual void printErr()输出错误。
根据以上条件我写了一个测试代码。
#include <iostream>
using namespace std;
class Myarray
{
public:
Myarray(int len);
~Myarray();
int getlen();
int& operator [](int index);
class eSize
{
public:
eSize(int size)
{
m_size =size;
}
virtual void pritErro()
{
cout << "Size" << m_size << endl;
}
protected:
int m_size;
};
class eNagative :public eSize
{
public:
eNagative(int size):eSize(size)
{
}
virtual void pritErro()
{
cout << "eNagative_Size:" << m_size << endl;
}
};
class eZero :public eSize
{
public:
eZero(int size) :eSize(size)
{
}
virtual void pritErro()
{
cout << "eZero_Size:" << m_size << endl;
}
};
class eTooBig:public eSize
{
public:
eTooBig(int size) :eSize(size)
{
}
virtual void pritErro()
{
cout << "eTooBig_Size:" << m_size << endl;
}
};
class eTooSmall :public eSize
{
public:
eTooSmall(int size) :eSize(size)
{
}
virtual void pritErro()
{
cout << "eTooSmall_Size:" << m_size << endl;
}
};
private:
int length;
int *m_base;
};
Myarray::Myarray(int len)
{
if (len < 0)
{
throw eNagative(len);
}
else if (len==0)
{
throw eZero(len);
}
else if (len < 10)
{
throw eTooSmall(len);
}
else if (len >1000)
{
throw eTooBig(len);
}
length = len;
m_base = new int[length];
}
Myarray::~Myarray()
{
if (m_base != NULL)
{
delete [] m_base;
m_base = NULL;
length = 0;
}
}
int Myarray::getlen()
{
return length;
}
int &Myarray::operator[](int index)
{
return m_base[index];
}
int main()
{
try
{
Myarray a(-5);
for (int i = 0; i <a.getlen();i++)
{
a[i] = i + 1;
cout << a[i] << endl;
}
}
catch (Myarray::eSize &e)
{
e.pritErro();
}
return 0;
}
如果写成
Myarray a(-5); 会出现如下图所示结果
如果是Myarray a(20);会出现下面的结果。
其余就不一一测试了,这里要说的是
异常是超脱函数机制,是跨函数的。
异常严格的按照类型匹配原则。
基础知识就到这里。