异常类匹配方式
throw抛出的异常类型和catch中处理的异常类型需严格匹配,异常处理器不做类型转换,下面几种情况除外:
1. 基类可以匹配到派生类这个在函数和异常匹配中都是有效的,但是需要注意catch的形参需要是引用类型或者是指针类型,否则会导致切割派生类这个问题。
2. 允许非常量到常量的烈性转化
3. 允许数组被转换为数组指针,允许函数被转换为函数指针
抛出异常的捕获机制
抛出一个异常的时候,异常会随着函数调用关系,一级一级向上抛出,直到被捕获才会停止,如果最终没有被捕获(catch)将会导致调用terminate函数。,C++提供了set_terminate 函数可以用来设置自己的terminate函数.设置完成后,抛出的异常如果没有被捕获就会被自定义的terminate函数进行处理。
异常中的资源清理问题
c中函数跳转时不会调用对象的析构函数,会导致内存泄露的问题。C++中的异常则不会有这个问题,C++中通过堆栈反解将已经定义的对象进行析构,但是有一个例外就是构造函数中如果出现了异常,那么这会导致已经分配的资源无法回收。所以,因此实际编程过程中应该避免在构造函数/虚构函数中抛出异常,如果没有办法避免,那么一定要在构造/析构函数中对其进行捕获进行处理
catch(…)用于处理任意异常
C++中的标准异常
C++ 提供了一系列标准的异常,定义在 exception 中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:
![@c++标准异常](https://i-blog.csdnimg.cn/blog_migrate/df59e8149a3b18e2441b00896402d750.png)
下表是对上面层次结构中出现的每个异常的说明:
![@异常说明](https://i-blog.csdnimg.cn/blog_migrate/ddc857fbafeb190fcfa63575f6b608d0.png)