<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.不能抛出比基类虚函数更多的异常
转载于:https://blog.51cto.com/bagger/1335587