异常接口声明
- 为了加强程序的可读性,可以在函数声明中列出可能抛出异常的所有类型,例如:
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; }