异常

本文介绍了一种使用异常处理机制来确保数组类初始化时数组长度合法性的方法。通过定义不同类型的异常,如eNegative、eZero、eTooSmall和eTooBig,实现了对数组长度的有效检查,并通过多态打印异常信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

异常设计出来之后,却发现在错误处理方面获得了最大的好处。



案例:设计一个数组类 MyArray,重载[]操作,
数组初始化时,对数组的个数进行有效检查 
index<0 抛出异常 eNegative  
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)
	{
		if(len < 0)
			throw eNegative(len);
		if(len == 0)
			throw eZero(len);
		if(len < 10)
			throw eTooSmall(len);
		if(len > 1000)
			throw eTooBig(len);
		this->len = len;
		m_p = new int[len];
	}
	~MyArray()
	{
		if(m_p != NULL)
			delete []m_p;
	}
	int &operator[](int index)
	{
		return m_p[index];
	}

public:
	class eSize
	{
	public:
		eSize(int size)
		{
			this->size = size;
		}
		virtual void printErr() = 0;
	protected:
		int size;
	};

	class eNegative : public eSize
	{
	public:
		eNegative(int len) : eSize(len)
		{

		}
		void printErr()
		{
			printf("异常 数组长度 < 0, 长度:%d\n",size);
		}
	};

	class eZero : public eSize
	{
	public:
		eZero(int len) : eSize(len)
		{

		}
		void printErr()
		{
			printf("异常 数组长度 = 0, 长度:%d\n",size);
		}
	};

	class eTooSmall : public eSize
	{
	public:
		eTooSmall(int len) : eSize(len)
		{

		}
		void printErr()
		{
			printf("异常 数组长度 < 10, 长度:%d\n",size);
		}
	};

	class eTooBig : public eSize
	{
	public:
		eTooBig(int len) : eSize(len)
		{

		}
		void printErr()
		{
			printf("异常 数组长度 > 1000, 长度:%d\n",size);
		}
	};

private:
	int len;
	int *m_p;
};


int main4_1()
{
	try
	{
		MyArray a(10000);
	}
	catch (MyArray::eSize &e)    //利用多态
	{
		e.printErr();
	}
	catch (...)
	{
		printf("捕捉到其他类型的异常\n");
	}
	
	system("pause");
	return 0;
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值