1. 抛出的异常对象不应该是指针类型
因为指针指向的对象的删除和析构由谁来处理,什么时候执行,都是无法确定的事情,C++也没有定义,比如堆和栈上的对象的处理方式必然不一样
2. 不能显式地把NULL作为异常对象抛出
因为throw(NULL)=tbrow(0),因此NULL会被当作整型捕获,而不是空指针常量,这可能与程序员的预期不一致
3. 如果一个函数声明时指定了具体的异常类型,那么它只能抛出指定类型的异常
函数的代码结构如下:返回值类型函数名(形参表)throw(类型名表){函数体}
int A() throw(myexception, int)  -- 只能抛出myexception和int两种类型的异常
int A() throw()                  -- 不抛出任何异常
int A()                          -- 可以抛出任何异常,也可以不抛出异常
函数原型中的异常声明要与实现中的异常声明一致,否则会引起异常冲突。由于异常机制是在运行出现异常时才发挥作用的,因此如果函数的实现中抛出了没有在其异常声明列表中列出的异常,编译器也许不能检查出来。当抛出一个未在其异常声明列表里的异常类型时,unexpected()函数会被调用,默认会导致std::bad_exception类型的异常被抛出。如果std::bad_exception不在异常声明列表里,又会导致terminate()被调用,从而导致程序结束
4. 异常只能在初始化之后而且程序结束之前抛出
5. throw语句中的表达式本身不能引发新的异常
6. 空的throw语句只能出现在catch语句块中
空的throw用来将捕获的异常再抛出,可以实现多个处理程序问异常的传递。然而,如果在catch语句外用,由于没有捕获到异常,也就没有东西可以再抛出,这样会导致程序以不定的方式终止(这依赖具体的编译器)
7. 典型的try-catch结构应该是派生派在最前面,基类在后,最后是...
8. catch的处理顺序为从上到下,只要找到一个匹配的异常类型,后面的异常处理都被忽略
9. 若异常对象为类的对象时,应该通过引用来捕获
若不是用引用,则派生类对象总是会被截断成为基类对象