异常接口声明
- 为了加强程序的可读性,可以在函数声明中列出可能抛出异常的所有类型,例如:
void func() throw(A,B,C);
这个函数func能够且只能抛出类型A,B,C及其子类的异常 - 如果在函数声明中没有包含异常接口声明,则此函数可以抛任何类型的异常,例如:
void func()
- 一个不抛任何类型异常的函数声明为:
void func() throw()
- 如果一个函数抛出了它的异常接口声明所不允许抛出的异常
unexcepted
函数会被调用,该函数默认行为调用terminate
函数中断程序 - 如果想抛出特定的类型异常,可以利用异常的接口声明。
- void func() throw()//throw(int)只能抛出int类型的异常 throw()不抛出任何类型的异常
异常变量的生命周期
-
throw的异常是有类型的,可以是数字,字符串,类对象
-
throw的异常是有类型的,catch需严格匹配异常类型
-
如果MyException e,会多开销一份数据,调用拷贝构造
-
如果MyException *e,不会提前释放对象new自己管理delete
-
推荐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;}
异常的多态使用
-
利用多态来实现
printError
同一个接口的调用 -
抛出不同的错误对象
#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;}