c++中的异常---2(异常接口声明,异常变量的生命周期,异常的多态使用)

异常接口声明

  1. 为了加强程序的可读性,可以在函数声明中列出可能抛出异常的所有类型,例如:void func() throw(A,B,C);这个函数func能够且只能抛出类型A,B,C及其子类的异常
  2. 如果在函数声明中没有包含异常接口声明,则此函数可以抛任何类型的异常,例如:void func()
  3. 一个不抛任何类型异常的函数声明为:void func() throw()
  4. 如果一个函数抛出了它的异常接口声明所不允许抛出的异常unexcepted函数会被调用,该函数默认行为调用terminate函数中断程序
  5. 如果想抛出特定的类型异常,可以利用异常的接口声明。
  6. void func() throw()//throw(int)只能抛出int类型的异常 throw()不抛出任何类型的异常

异常变量的生命周期

  1. throw的异常是有类型的,可以是数字,字符串,类对象

  2. throw的异常是有类型的,catch需严格匹配异常类型

  3. 如果MyException e,会多开销一份数据,调用拷贝构造

  4. 如果MyException *e,不会提前释放对象new自己管理delete

  5. 推荐MyException &e容易些,而且就一分数据

     #include<iostream>
     
     using namespace std;
     
     class myException
     {
     public:
     	myException()
     	{
     		cout << "myException的默认构造" << endl;
     	}
     	myException(const myException&e)
     	{
     		cout << "myException的拷贝构造" << endl;
     	}
     
     	~myException()
     	{
     		cout << "myException的析构调用" << endl;
     	}
     
     	void prtintError()
     	{
     		m_A = 100;
     		cout << "error" <<this->m_A << endl;
     	}
     
     	int m_A;
     };
     
     void doWork()
     {
     	throw & myException();
     
     }
     
     void test01()
     {
     	try
     	{
     		doWork();
     	}
     	catch (myException *e)//myException e会多开销一份数据
     	{
     		//e->prtintError();
     		//e->prtintError();
     		//e->prtintError();//指向非法内存空间,不应该这么做
     		cout << "捕获异常" << endl;
     		//delete e; //靠自觉释放对象
     	}
     
     	
     	
     }
     
     int  main()
     {
     
     	test01();
     	system("pause");
     	return 0;
     }
    

异常的多态使用

  1. 利用多态来实现printError同一个接口的调用

  2. 抛出不同的错误对象

     #include<iostream>
     
     using namespace std;
     
     //异常基类
     class BaseException
     {
     public:
     	virtual void printError()
     	{
     
     	}
     };
     
     class NullPointerException : public BaseException
     {
     public:
     	virtual void printError()
     	{
     		cout << "空指针异常" << endl;
     	}
     };
     
     class OutofRangeExcrption : public BaseException
     {
     public:
     	virtual void printError()
     	{
     		cout << "越界异常" << endl;
     	}
     };
     
     void doWork()
     {
     	//throw..
     	//throw NullPointerException();
     	throw OutofRangeExcrption();
     }
     
     void test01()
     {
     	try
     	{
     		doWork();
     	}
     	catch (BaseException  &e)
     	{
     		e.printError();
     	}
     }
     
     
     int main()
     {
     	test01();
     
     	system("pause");
     	return 0;
     }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值