当前位置: 首页 > news >正文

台前网站建设电话百度账号注册申请

台前网站建设电话,百度账号注册申请,建站费用明细,半导体网站建设目录 1、异常的关键字 2、异常的写法 3、异常的使用规则 3.1 规则1 3.2 规则2 3.3 规则3 3.4 规则4 3.5 规则5 4、异常的重新抛出 5、异常的规范 5.1 C98的异常规范 5.2 C11的异常规范 6、C标准库的异常体系 7、异常的优缺点 结语 前言#xff1a; C的异常…        目录 1、异常的关键字 2、异常的写法 3、异常的使用规则 3.1 规则1 3.2 规则2 3.3 规则3  3.4 规则4 3.5 规则5  4、异常的重新抛出  5、异常的规范  5.1 C98的异常规范 5.2 C11的异常规范 6、C标准库的异常体系 7、异常的优缺点 结语  前言 C的异常是一种处理程序bug的方式如今面向对象的语言基本都是用异常处理错误的因为他可以帮助程序员快速定位错误的根源。当一个函数或者是一段代码发现了自己处理不了的错误就可以将该错误抛出又称异常抛出由外部的调用者或间接调用者捕获该错误又称异常捕获。 1、异常的关键字 若要使用异常则需要用到三个关键字try、throw、catch。他们的具体用法如下 trytry有属于自己的作用域在他的作用域中存放可能会抛出异常的代码或者函数。         throwthrow有着“抛出”的动作throw后面跟一段内容当程序出现错误时throw会抛出其后面的内容即抛出异常作为错误的描述通常throw后面跟一段字符串作为错误描述。         catchcatch是捕获的意思并且他只能捕获try里面代码的异常。当throw抛出了异常那么就需要catch捕获该异常不过要先捕获该异常catch的捕获类型必须与throw抛出内容的类型一致才可以捕获。具体看下文举例 2、异常的写法 异常的代码格式如下 try {// 可能会抛异常的代码 }catch( type e1 )//抛出的异常用形参e1捕获 {// 通常对e1的内容进行打印 }catch( type e2 )//可以有不同的捕获类型 {// 如上 }catch( type en ) {// 如上 } 举例说明 #define _CRT_SECURE_NO_WARNINGS 1#includeiostream using namespace std;int main() {try{int a;cin a;if(a 0)//如果输入的a小于0说明发生错误throw a为负数发生错误;//抛异常a为负数发生错误类型是char*}catch (const char* str)//因为抛出的因此类型是字符串因此可以用char*接收{cout str endl;//打印异常的错误}return 0; } 运行结果 3、异常的使用规则 3.1 规则1 抛出异常和捕获异常的类型必须匹配否则是捕获不了该异常的若不匹配先会去找其他的catch能否类型匹配若没找到则说明抛出的异常没有对应的捕获类型则会报错。 示例如下图 3.2 规则2 抛出的异常会被离该异常最近位置的catch捕获前提是该catch与异常类型匹配示例代码如下 #define _CRT_SECURE_NO_WARNINGS 1#includeiostream using namespace std;void _func() {int a -2;if (a 0)//如果输入的a小于0说明发生错误throw a为负数发生错误;//抛异常a为负数发生错误 }void func() {try{_func();//复用}catch (const char* str)//func函数的捕获{cout void func() str endl;//打印异常的错误} }int main() {try{func();}catch (const char* str)//main函数的捕获{cout main() str endl;//打印异常的错误}return 0; } 运行结果 从结果可以看到该异常被离他最近的func函数所捕获假如此时的func函数的捕获类型不能与异常类型相匹配才会让main函数中的catch去捕获。  3.3 规则3  若catch捕获到了该try中的异常则会从捕获该异常的catch之后开始执行剩下的代码跳过其他的catch 示例代码如下 #define _CRT_SECURE_NO_WARNINGS 1#includeiostream using namespace std;void _func() {int a -2;if (a 0)//如果输入的a小于0说明发生错误throw a为负数发生错误;//抛异常a为负数发生错误 }void func() {_func();//复用 }int main() {try{func();}catch (const char* str){cout str endl;//打印异常的错误}catch (const int* str)//若异常已经被捕获则会跳过该catch{cout str endl;}cout 继续执行catch的下面代码 endl;return 0; } 运行结果 3.4 规则4 当一个函数栈帧中抛出了异常则编译器先会在该栈帧中查看是否有合适的catch捕获若没有则结束该栈帧回到调用该函数的上一层栈帧中查看是否有合适的catch若没有也结束当前栈帧直到回到main函数中若还没有合适的catch则直接报错参考规则1该过程又叫栈回收。 具体示意图如下 所以从上面可以发现如果没有合适的catch则程序会被直接终止且报错为了避免这种极端情况一般会用catch(...)来接收任意类型的异常。 万能捕获catch(...)示例代码如下 #define _CRT_SECURE_NO_WARNINGS 1#includeiostream using namespace std;void _func() {int a -2;if (a 0)//如果输入的a小于0说明发生错误throw a为负数发生错误;//抛异常a为负数发生错误 }void func() {_func();//复用 }int main() {try{func();}catch (const int* str){cout str endl;//打印异常的错误}catch (...)//万能捕获{cout 其他类型错误 endl;//打印异常的错误}return 0; } 运行结果 从结果可以看到只要有了万能类型捕获则无论是什么样类型的异常都不会因为没能捕获而导致程序直接被终止。 3.5 规则5  抛出的异常也可以是一个对象这时候抛出的并不是对象本身因为catch在别的作用域所以抛出的是该对象的一个拷贝对象并且该拷贝对象的生命周期会在catch之后销毁所以catch的形参可以用引用接收该形参是拷贝对象的别名而不是抛出的局部对象的别名。示例代码如下 #define _CRT_SECURE_NO_WARNINGS 1#includeiostream using namespace std;void _func() {int a -2;if (a 0)//如果输入的a小于0说明发生错误throw string(a为负数发生错误);//抛出的是string类型 }void func() {_func();//复用 }int main() {try{func();}//捕获的类型是string并且可以用引用因为返回的是拷贝对象catch (const string str){cout str endl;//打印异常的错误}catch (...)//万能捕获{cout 其他类型错误 endl;//打印异常的错误}return 0; } 运行结果 4、异常的重新抛出  异常的重新抛出是为了解决空间资源和捕获异常同时出现的情况上文提到捕获异常时如果在别的函数栈帧中才捕获该异常则编译器会结束之前的栈帧那么如果之前的栈帧里涉及到空间资源的问题则会引发一个问题其他栈帧里的空间还没来得及释放就因为要捕获异常而结束了该栈帧会导致内存泄漏的问题。 示例代码如下 #define _CRT_SECURE_NO_WARNINGS 1#includeiostream using namespace std;void _func() {int a -2;if (a 0)//如果输入的a小于0说明发生错误throw string(a为负数发生错误);//抛出的是string类型 }void func() {int* arr new int;//涉及到空间资源的管理try{_func();}catch (...)//函数func中必须捕获该异常才能释放申请的空间否则直接跳到main函数了{cout delete arr endl;delete arr;throw;//重新抛出的写法}cout delete arr endl;delete arr; }int main() {try{func();}//捕获的类型是string并且可以用引用因为返回的是拷贝对象catch (const string str){cout str endl;//打印异常的错误}catch (...)//万能捕获{cout 其他类型错误 endl;//打印异常的错误}return 0; } 运行结果 5、异常的规范  异常的规范可以让函数的使用者清晰的看到该函数会抛出什么类型的异常或会不会抛出异常。 5.1 C98的异常规范 throw()是C98的异常规范关键字他通常写在函数接口的后面具体用法如下 // 这里表示这个函数会抛出int,char,char*中的某种类型的异常 void func() throw(int,char,char*);// 这里表示这个函数不会抛出异常 void func() throw();//在异常规范中没有声明throw()则表示该函数可能抛出任意类型的异常 void func() 5.2 C11的异常规范 C11对应异常规范新增了一个关键字noexcept该关键字同样写在函数的接口后面表示该函数不会抛任何的异常用法如下 //表示func不会抛异常 func() noexcept;并且noexcept严格执行规范若一个函数加了noexcept结果该函数会抛出异常那么运行后就直接报错并且复用该函数的函数也会判断为会抛出异常的函数。 测试代码如下 #define _CRT_SECURE_NO_WARNINGS 1#includeiostream using namespace std;void _func() {int a -2;if (a 0)//如果输入的a小于0说明发生错误throw string(a为负数发生错误);//抛出的是string类型 }void func()noexcept//给func函数加上noexcept事实上该函数会抛异常运行后报错 {int* arr new int;//涉及到空间资源的管理try{_func();}catch (...)//函数func中必须捕获该异常才能释放申请的空间否则直接跳到main函数了{cout delete arr endl;delete arr;throw;//重新抛出的写法}cout delete arr endl;delete arr; }int main() {try{func();}//捕获的类型是string并且可以用引用因为返回的是拷贝对象catch (const string str){cout str endl;//打印异常的错误}catch (...)//万能捕获{cout 其他类型错误 endl;//打印异常的错误}return 0; } 运行结果 6、C标准库的异常体系 C标准库中也提供了一部分异常信息可供用户捕获以便让程序员使用时可以更好的定位错误根源。这些异常类型是以继承和多态的结构存在的他们都有一个共同的父类exception所以程序员只需要用该父类作为捕获的类型然后根据多态的条件父类指针或引用会调用子类的虚函数就可以打印出来正确的错误信息了。 关系图 具体异常信息如下图 标准库里的异常信息使用方式如下 #define _CRT_SECURE_NO_WARNINGS 1#includeiostream #includevector using namespace std;int main() {try {vectorint v1;// 这里如果系统内存不够也会抛异常v1.reserve(1000000000);}catch (const exception e) // 这里捕获父类对象就可以{cout e.what() endl;}return 0; } 运行结果 7、异常的优缺点 异常的优点 1、异常可以展现出清晰的错误信息以便帮助程序员快速的定位错误位置。         2、异常可以直接抛出给最外层这样一来可以在统一的地方进行处理异常即使复用的函数栈帧很深时也无需每层栈帧都检查一遍是否有异常。         3、一些常用的库也存在异常的概念如boost、gtest、gmock。         4、有些特殊的函数不能有返回值比如构造函数因此不能用错误码一层层返回的方式来定位构造函数的错误所以构造函数出了bug只能用异常发现问题。 异常的缺点 1、 捕获异常时若涉及空间资源管理则稍不谨慎就会发生内存泄漏。         2、因为抛出的异常会直接跳到main函数中所以有些场景下调试起来不方便。         3、异常规范并不是强制行为因此可能会出现有些代码没加noexcept实际上却没有抛异常的可能。 总结总而言之异常还是利大于弊的。 结语  以上就是关于C异常的讲解异常在程序中发挥着至关重要的作用有了异常就能快速定位bug帮助程序员节省了改bug的时间最后希望本文可以给你带来更多的收获如果本文对你起到了帮助希望可以动动小指头帮忙点赞关注收藏如果有遗漏或者有误的地方欢迎大家在评论区补充谢谢大家
http://www.pierceye.com/news/788658/

相关文章:

  • 政和县建设局网站公告征婚网站咋做
  • 做网站需要用到的语言注册公司需要多少钱保证金
  • 如何给别人做网站赚钱互联网广告营销方案
  • 上海专业做网站公司地址软文代写
  • 家居网站源码宁波专业建设网站建站公司
  • 成都网站建设 Vr功能 卓 公司网站后台管理系统怎么用
  • 微站网建站系统南昌科技网站建设
  • 商家网站建设模板快速备份wordpress
  • 网站建设推广价格肯德基网站建设
  • 网站开发课程百度云平湖公司做网站
  • 手机网站建设品牌什么是企业云网站建设
  • 烟台网站建设推荐企汇互联见效付款58同城网站模板
  • 琪恋网站建设深圳3d网站建设
  • 做ic用什么网站软文代写平台
  • 厦门网站建设 九来网站建设公司如何发展
  • 广州 网站的设计公司耒阳市古雍网站建设店
  • 保定网站推广费用网站搜索 收录优化
  • 三河市建设厅公示网站个人flash网站
  • 建设网站工具上海网站制作团队
  • 化妆品网站系统规划wordpress 站群软件
  • 深圳低价做网站广告免费设计在线生成
  • 网站服务体系网站开发补充合同范本
  • 萝岗做网站网站优化大计
  • 服装店网站模板北京网站设计公司哪个好
  • 网站运维工作内容网页设计与制作课程小结
  • 2019网站怎么做网站快速备案公司
  • 上饶网站制作专业网站设计如何提升网页品质
  • 哈尔滨微信网站建设学网站设计和平面设计
  • 网站开发公司网站官网焦作建设企业网站公司
  • 设备上哪个网站做外贸推广php版本不同于wordpress使用