目录

  • C++的异常处理方法知识要点
  • 踹扔抓的代码块示例
  • 两种处理被0除的方法
  • 异常处理机制的优点
  • 其他语言中的异常处理
  • C++函数异常声明

C++的异常处理方法知识要点

理解“踹扔抓”三部曲的结构,尤其是catch是怎么匹配异常的。

知道C++标准库中的异常类都是从exception继承下来的,并且支持 what() 这个操作

了解logic_error、runtime_error等一些常见的异常类的大致含义,以便于我们自己写异常类的时候拿来继承

理解多个catch语句的匹配原则,尤其是对于继承链上的异常类型,哪个在前哪个在后必须做到心里有数

掌握异常传播的原理:异常如果在当前函数中没有被捕获,它就会被抛向当前函数的调用者;抛异常的语句后面的语句都会被跳过,直到遇到对应的catch

踹扔抓的代码块示例

try{code to try;throw an exception (1)with a throw statement(2) or from functionMore code to try;
}
catch(type e){Code to process the exception;
}

两种处理被0除的方法

(1) use if statement (使用if语句)
(2) use exception handling (使用异常处理)

下面是使用异常处理的程序,如果除数是0,那么会抛出number1;执行throw语句之后, 紧随其后的 cout 语句就会被跳过;
如果能够抓住number1,那么就会进行处理,不会出现程序出错。
如果type不匹配,就会抓不住,程序会崩溃。

int main() {// Read two intergerscout << "Enter two integers: ";int number1, number2;cin >> number1 >> number2;try {if (number2 == 0)throw number1;cout << number1 << " / " << number2 <<" is "  << (number1 / number2) << endl;}catch (int e) {cout << "Exception: an integer " << e <<" cannot be divided by zero" << endl;}cout << "Execution continues ..." << endl;
}

异常处理机制的优点

可将异常信息从被调函数带回给主调函数。异常处理实际上是对程序执行流程的控制

如下例:在quotient里面遇到异常,将异常扔出而不对异常进行处理,问题交由主调函数main来处理。从而将异常的发现与处理分开。

//用异常处理
int quotient(int number1, int number2) {if (number2 == 0) throw number1; return number1 / number2;
}
int main() {try {int x = quotient(1, 0);} catch (int) {std::cout << "除数为0!";}
}

若不用异常处理:quotient()如何告诉 main() “number2 有问题”?
我们可以从返回值和传引用的角度思考,但是若是函数嵌套调用,该如何将异常信息带回给主调函数

(1) 用返回值?
·f(number2 == 0) return x; //x应该是0还是1?
(2) 用指针/引用类型的参数?然后再主函数去查看这个参数,但是不优雅。
int quotient(int n1, int n2, int &s){ if(n2 == 0) s=-1; //求商,函数要3个参数? }
(3) 如果采用 f(g(h(quotient(x,y))));怎样将错误从quotient() 传到 f()?若是使用(2),难道要在每个函数加上一个引用类型的参数来让主调函数查询是否出现异常吗?
显然,在这种情况下用异常处理更加简洁

其他语言中的异常处理

python中:

try:代码raise xxx抛出异常
except:错误时执行
else:没有错误时执行
finally无论如何都执行

关于java与C++:
在C++中,你可以抛出任何类型的异常。(c++可以抛出任何类型,,java中这样是不行的).
Java的函数异常声明是在编译时刻检查的,所以如果是java任何调用abc函数的其他函数,java虚拟机会强迫那些调用abc函数的其他函数处理matherr, error这些异常。
而C++编译在时候,对这些调用 以声明会抛出异常函数 的其他函数,不会强制他们处理这些可能会抛出的异常。

C++函数异常声明

1、在函数参数列表后声明可能会抛出的异常:
C++从某个年代就开始,在函数的后面加上“:”+ throw+“()”,圆括号内有1个或多个异常类,多个用逗号分割。
void abc( int a ) : throw ( matherr, error) {…}
这是告诉别的程序,在abc函数的运行时刻,最多可以抛出圆括号里的哪些个异常类。
2、函数后声明可能抛出的异常 的 意思:
当前函数运行时刻有可能会抛出的异常,但是保证不会抛出圆括号内matherr, error以外的其他异常。

C++函数异常声明,不是用来约束那些调用声明可能会抛出异常abc函数 的其他函数。不是约束其他函数 调用abc 就必须处理matherr, error这些异常。而是用来约束abc函数本身的行为。abc 函数声明会抛出matherr, error这些异常,如果abc函数运行时抛出了除了matherr, error以外的异常,程序会抛出unexpected(想不到/未知的)异常然后程序终止。
·C++函数后声明/不声明异常:

·1、void abc( int a ) {…} //普通函数

普通函数表示可以抛出任何异常

·2、void abc( int a ):throw() {…} // 不抛异常的函数

函数参数后 throw(),圆括号内没有任何东西,表示这个函数承诺不会抛出任何异常!

·3、void abc( int a ):throw(matherr) {…} //函数会抛出matherr

函数参数后 throw(),圆括号有matherr,表示运行时会有一个机制检验这个函数是否真的,只抛出了列表里的matherr异常。

·区别与Java函数后声明/不声明异常:

·1、void abc( int a ) {…} //普通函数

普通函数表示不抛出任何异常

·2、void abc( int a ) throw(exception) {…} // 抛出任何异常 函数参数后
throw(),圆括号内有exception,表示这个函数会抛出任何异常!

【C++基础】异常处理机制概要相关推荐

  1. Java基础-异常处理机制

    //什么是异常? 程序运行的过程中发生的各种错误 //为什么学习异常? 1.让程序逻辑思维更健康 2.有能力解决异常 //A异常的分类 //1 未检查异常:编译时不报错,运行时可能出错.[实质上是一些 ...

  2. Java基础——Java异常处理机制

    一.引言 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中 ...

  3. Python入门基础-六、案例3 基础代谢率(BMR)计算器 #Python中常用的数值类型#字符串分割与格式化输出#异常处理机制

    (课程相关的所有资料代码,已上传至CSDN,请自行下载 https://download.csdn.net/download/qq_34243930/10764180 ) BMR 计算器 1.0 Py ...

  4. 【Java基础知识】 异常处理机制

    "欲渡黄河冰塞川,将登太行雪满山." 系统运行,风云不测,睹始知终,秋去冬来,一叶落而知秋. 1. 什么是异常? 所有使我们程序提前终止,或者没有向预想方向去执行的错误统称为异常. ...

  5. python基础编程之 7-2 python的异常处理机制

    7-2 python的异常处理机制 Date: 2021-06-13 Author: SunnyChou 异常处理 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行. python提 ...

  6. c语言c2182是什么错误,C语言中一种更优雅的异常处理机制

    上一篇文章对C语言中的goto语句进行了较深入的阐述,实际上goto语句是面向过程与面向结构化程序语言中,进行异常处理编程的最原始的支持形式.后来为了更好地.更方便地支持异常处理编程机制,使得程序员在 ...

  7. 简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

  8. Java程序员从笨鸟到菜鸟之(十二)java异常处理机制

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  9. [网络安全自学篇] 五十四.Windows系统安全之基于SEH异常处理机制的栈溢出攻击及防御解析

    这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了XP和Kali环境搭建,通过Windows漏洞实现栈溢出攻击,通过Me ...

最新文章

  1. Spirng MVC +Velocity 表单绑定命令对象
  2. 23种设计模式C++实现UML+源码汇总
  3. c语言中for优化,c – 在For循环中发生了什么GCC优化?
  4. [Tips] WSL ubuntu 18.04 安装python3
  5. SQL Server Junior Database Administrator方案相关的访谈问答
  6. Java设计模式透析之 —— 适配器(Adapter)
  7. python 在线培训费用-在线Python编程培训哪家机构比较好?
  8. 笔记本平板电脑推荐_平板电脑推荐表(2020.618)
  9. 文件服务器报告,文件服务器报告
  10. 西门子/软件/S7-300.400/simatic step 7 v5.5 sp4 chinese
  11. 【企业】走近华为,微观世界
  12. 爬虫项目开发与实践,附东方财富7x24小时实时信息代码
  13. 华硕固件 mysql_刷华硕固件后的桥接中继教程
  14. Python爬虫实战——今日头条图片下载
  15. 名帖140 启功 楷书《临竹山连句》
  16. matlab中如何输入积分,在matlab中怎么输入特殊符号,Matlab的符号积分
  17. 赛效:WPS何把文档里竖排的文字变成横排的
  18. [2021绿城杯] [Misc] 流量分析 + cobaltstrike 流量解密
  19. Ubuntu定时开关机
  20. 怎么获取机智股票自动交易软件

热门文章

  1. React组件实现越级传递属性
  2. 如何使用github搭建个人博客
  3. 关于软件测试学习心得
  4. Redis与Zookeeper实现分布式锁的区别
  5. 删除kafka topic
  6. 安装python3 及virtual与virtualenvwrapper
  7. 23种计模式之Python实现(史上最全最通俗易懂)内容整改中
  8. intellij idea中解决java.lang.VerifyError: Expecting a stackmap frame at branch target的方法
  9. LeetCode的二分查找的练习部分总结
  10. 爬虫框架:scrapy