一.概念
c语言处理错误的方式是通过错误码。先将出现的错误编号,然后通过这个错误码(编号)去查询错误信息,这么操作比较麻烦。
异常是c++处理错误的一种方式 ,c++出现错误会抛出一个对象,从而引发异常,这个对象里包含更为详细全面的错误信息。就相当于运行时,程序出问题,但不让它崩溃掉,用一种抛对象的方式来提醒你,程序出问题了。

二.异常的抛出和捕获
1.三个关键字
在看相关概念之前,我们能要先了解三个关键字:try,throw,catch;它们主导了整个抛出,捕获的过程。
Ⅰ.throw
用于抛出任意类型的异常对象。

Ⅱ.try
try+{}用于包裹可能会出错(抛异常)的代码块。监控可能出异常的函数调用。

Ⅲ.catch
用于捕获throw抛出来的那个对象(异常),它必须紧跟在try模块之后,可以重载多个。
catch后的"()"里装的是某个类型的对象,用于与throw过来的对象进行匹配 ,假如对象与某个catch的()里的类型相同且距离抛异常位置距离最近,就用这个catch进行捕获。

2.抛出和捕获相关概念


整个抛异常粗略的流程:

3.栈展开
这里来更细节地探讨整个抛异常的过程。


异常没有被捕获,或是沿着调用函数链查找,已经到了main函数还是没有匹配的match,代码会直接崩掉:


4.查找匹配的处理代码
此处再补充一下catch匹配的细节。
①.兜底机制
为了防止因在整个调用函数链都找不到匹配的match而造成的程序崩溃,这里有了一个能捕获所有类型对象的万能match:


②.其余概念

第二段画方框的地方就是指catch的()里写的是基类的类型,但能去捕获这个基类的不同派生类,去获得不同的结果(异常),这是个多态。就像是报父亲的名号,结果消费的是儿子一样,而且有很多个儿子,每个儿子的消费结果是不一样的。
5.异常的重新抛出


相当于对抛出的对象进行了一次拦截,对某种进行特殊处理,然后再抛出(throw)给外层调用链,再用调用链中的另外catch再次捕获,而其他不做处理的,就直接再抛出(throw)。
6.异常安全


7.异常规范
为了尽可能避免抛异常导致的资源没释放,造成的安全问题,有了一种提醒的方式。就是标注哪个函数会出现抛异常,哪个不会,这样能提早帮助程序员有针对性地设计函数里的资源申请,释放。
传统派c++98和创新派c++11方案的对比:



左右脑互博,会抛异常的函数加个noexcept不会报错,但强行执行,程序会崩:




三.标准库的异常
