C++异常处理

举报
用户已注销 发表于 2021/11/19 04:44:24 2021/11/19
【摘要】 目录 1,try,catch 2,throw 3,异常类 4,多重异常捕获 5,重抛出异常 6,异常规约(抛出列表) 7,noexcept 1,try,catch try里面执行正常语句,如果出现标准异常,系统会抛出异常,catch可以捕获异常并处理,这样就不至于导致程序崩溃。 catch可以捕获特定类型的异常,也...

目录

1,try,catch

2,throw

3,异常类

4,多重异常捕获

5,重抛出异常

6,异常规约(抛出列表)

7,noexcept


1,try,catch

try里面执行正常语句,如果出现标准异常,系统会抛出异常,catch可以捕获异常并处理,这样就不至于导致程序崩溃。

catch可以捕获特定类型的异常,也可以用...捕获所有异常


  
  1. int main()
  2. {
  3. try {
  4. int x;
  5. cin >> x;
  6. int *p = new int[x];
  7. cout << "success";
  8. }
  9. catch(...){
  10. cout << "fail";
  11. }
  12. return 0;
  13. }

输入-1,输出fail

并不是所有的异常都是标准异常,比如除0就不是。


  
  1. int main()
  2. {
  3. try {
  4. int y;
  5. cin >> y;
  6. y = 1 / y;
  7. }
  8. catch (...) {
  9. cout << "1/0";
  10. }
  11. return 0;
  12. }

输入0,程序直接崩溃,无法catch异常,因为系统根本没有抛出异常。

简单的说,除0是个非常底层的事件,为了保证性能,C++不把除0当做异常。

类似的,数组越界也不是异常。

2,throw

用throw可以主动抛出异常,异常类型可以是任何数据类型。


  
  1. int main()
  2. {
  3. try {
  4. int y;
  5. cin >> y;
  6. if (y == 0) {
  7. throw - 1;
  8. }
  9. y = 1 / y;
  10. }
  11. catch (int e) {
  12. cout << "1/0";
  13. }
  14. return 0;
  15. }

3,异常类

C++预定义了多个可用于创建异常对象的类,其中基类是exception类,类中包含虚函数what(),用来返回异常的错误信息。

也可以自定义异常类。

4,多重异常捕获

可以在一个try块后面添加多个catch块,以捕获多种类型的异常。

执行时会从前至后依次检查每个catch块是否匹配。

5,重抛出异常

在catch块中也可以throw异常,再交给别的地方处理。

6,异常规约(抛出列表)

不带异常规约的函数,可以抛出任何异常。

带异常规约的函数,如果抛出一个不在列表中的异常,会导致unexpected被调用。

如果抛出列表为空,抛出任何异常都会导致unexpected被调用。

7,noexcept

函数抛出异常:


  
  1. int f()
  2. {
  3. int y;
  4. cin >> y;
  5. if (y == 0) {
  6. throw - 1;
  7. }
  8. y = 1 / y;
  9. return 0;
  10. }
  11. int main()
  12. {
  13. try {
  14. f();
  15. }
  16. catch (int e) {
  17. cout << "1/0";
  18. }
  19. return 0;
  20. }

noexcept关键字可以用来限制函数不能抛出异常


  
  1. int f() noexcept
  2. {
  3. // ...
  4. return 0;
  5. }

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/104637942

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。