<1>c++异常匹配规格是根据对象的静态类型进行匹配的

<2>typedef void (*f)() throw(int) typedef 语句中不能有异常规格说明

<3>throw;向上级抛异常

throw x;抛出异常

1.使用异常说明:

   void foo(void) throw(MyException)/*异常说明,并且foo函数体中只能抛出异常说明中的异常*/{}//只抛出MyException异常

   void foo(void){}//抛出任何异常

   void foo(void)throw(){}//不抛出异常

   另外:如果一个函数抛出了一个在其异常说明中未被列出的异常,那么std::unexpected()函数就会被调用。

   它的缺省行为是调用std::terminate()函数,而后者又会调用abort()函数;

2.异常可以嵌套

3.如果函数的声明有异常说明,那么定义也需要有异常的说明

4.构造函数可以抛出异常,而且很多场合以这种方式处理构造过程中的错误会更简单。

   但是要注意,抛异常前应该做必要的释放资源工作,因为不完全对象的析构函数是不会被调用的。

5.不要在析构函数中抛出异常,因为抛出异常会导致对象的析构(C语言中如果出错可能会导致某些资源不能释        放),这样可能造成析构和抛出异常之间的死循环。

   如果在析构函数中有异常,应该在内部处理,不要抛出。

6.可以不处理抛出的异常,而交给上一层调用者,即向上一层继续抛出异常

7.示例:

class AppException {};

class SysException {};

throw AppException ();

throw SysException ();

try {


} catch (AppException& ex) {

   ex.what();

} catch (SysException& ex) {


}

8.注意__LINE__/__FILE__在自定义异常中的应用:

   throw MyExp (__FILE__, __LINE__);

9.不能抛出比基类虚函数更多的异常