概念C 异常Exception是语言内置的运行时错误处理机制用于在程序执行出现非正常状态时将错误信息从错误发生点沿着函数调用链向上传递到专门的错误处理位置实现错误检测与错误处理的解耦其核心设计思想是底层逻辑专注于功能实现遇到错误只需抛出异常上层业务逻辑专注于错误处理根据异常类型做出响应无需在每一层调用都做错误码判断和透传异常的机理程序出现问题时我们通过抛出throw)一个对象来引发一个异常该对象的类型以及当前的调用链会随着上述代码的过程依次寻找匹配的catch调用链中与该对象类型匹配且离抛出异常位置最近的那一个catch才能捕获到异常。根据抛出对象的类型和内容程序的抛出异常部分告知异常处理部分到底发生了什么错误当throw执行时throw后面的语句将不再被执行程序的执行从throw位置跳到与之匹配的catch模块这里还有两个重要的含义1、沿着调用链的函数可能提早退出。2、一旦程序开始执行异常处理程序沿着调用链创建的对象都将销毁。因此抛出异常对象后编译器会自己生成一个异常对象的拷贝这个拷贝的对象会在catch子句后销毁。这里的处理类似于函数的传值返回——返回的是一个拷贝值)如果到main函数后还没有找到匹配的catch机器就会调用标准库的teminate函数终止程序一般情况下抛出的对象是要和catch中的类型完全一致但也可有类型的转换如非常量向常量const的转换、允许数组向数组指针转换、允许函数向函数指针转换以及子类向父类的转换等。其中子类向父类的转换是十分有用且常见的继承体系基本都是通过这种方式设计的如果到main函数异常仍旧没有被匹配就会终止程序不是发生严重错误的情况下我们是不期望程序终止的如果程序终止相当于我们平常用的软件崩溃了一般不会允许出现这种情况都是将异常信息加载到日志然后等发现时修复所以一般main函数中最后都会使用catch(...)它可以捕获任意类型的异常但是是不知道异常错误是什么hrow;不带任何参数只能写在catch内作用是重新抛出当前正在捕获的原始异常对象 不会拷贝直接继续向上传递原来那个异常.异常机制带来的问题及解决措施异常如果处理不当会出现内存泄漏问题。如下代码我们不写catch(...)以及内部的delete防止出现异常不执行函数结尾的delete以及函数结尾写delete如果不写没有异常时就会有内存泄漏就会出现内存泄漏问题其次析构函数中对待异常要谨慎处理如果要释放10个资源释放了六个时出现异常剩下的四个可能没有释放因此也需要类似下述代码的捕获处理但是这样会代码十分不美观、冗余C11增加了智能指针来处理异常出现时的资源释放问题我们下一篇文章介绍它因此对于用户和编译器而言如果能预先知道某个程序会不会抛出异常就太棒了知道某个函数是否会抛出异常有助于简化调用函数的代码。C98就想到了这一点但当时的处理语法有点冗余C11提出了新的语法——在函数参数列表后加一个关键字noexcept表示不会有异常但是没加的话就可能会有异常当函数用noexcpt修饰时内部还写了throw编译器不会报错但有的可能会报警告但是运行时如果真出现异常了就会调用terminate函数终止程序此外noexcept关键字还可以检查一个表达式是否会抛出异常可能会抛出就为false不会抛出就为trueC标准库定义了一套异常继承体系库我们编写代码时可以在主函数写catch用exception这个库异常类的基类捕获要想获取异常信息就调用what函数what是⼀个虚函数下面是这个异常继承体系库的链接大家可以让大模型讲解一下C异常