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

小学生学C++编程语法知识(C++异常处理(Exception)入门)


魔法城堡里的警报器——C++异常处理(Exception)入门


一、故事开始:程序王国的危险按钮

1、在程序王国里,小Q是一名魔法程序员。

一天,国王交给他一个任务:

"请写一个计算除法的程序!"

小Q很快写出了程序:

cout << 10 / 2;

运行!

5

成功!


2、可是国王又说:

"如果有人输入0呢?"

例如:

cout << 10 / 0;

3、这时候……

程序王国突然响起了警报!

轰!! 程序崩溃!

4、因为:

任何数字都不能除以0!

所以程序出现了严重错误。


二、有没有办法提前报警?

1、现实生活中:

电影院失火怎么办?

有:

  • 火警报警器

  • 灭火器

  • 安全出口


2、程序也是一样。

如果发生危险,

不要让程序直接崩溃,

而是:

先发现危险,再进行处理。

这就是——

异常处理(Exception)

Exception

意思就是:

程序运行过程中发生了意外。


3、例如:

  • 除以0

  • 文件打不开

  • 数组越界(有些情况)

  • 内存不足

这些都叫:

异常(Exception)


三、异常处理三兄弟

1、C++异常处理只有三个关键词。

try throw catch

就像消防队一样。


2、第一位:try

(1)意思:

"这里可能发生危险,请盯着。"


(2)例如:

try { cout << 10 / x; }

(3)try里面放:

可能发生错误的代码。


3、第二位:throw

(1)意思:

"危险!危险!快报警!"


(2)例如:

throw "Zero Error";

程序立即停止当前工作。

跳出去找救援人员。


4、第三位:catch

(1)意思:

"收到报警,我来处理。"


(2)例如:

catch(const char* msg) { cout << msg; }

catch负责接住异常。


(3)所以:

throw ↓ catch

throw抛出去

catch接住


(4)是不是像扔球一样?

throw ○ catch \o/

四、完整流程

1、例如:

try { if(y==0) throw "Zero Error"; cout<<x/y; } catch(const char* msg) { cout<<msg; }

2、整个流程:

进入try ↓ y是不是0? ↓ 不是 ↓ 继续运行 ↓ 结束 ------------------- 如果是0 ↓ throw ↓ 跳出try ↓ 进入catch ↓ 输出错误信息

五、GESP真题讲解

1、题目:

try { int x = 10, y = 0; if (y == 0) throw "Zero Error"; cout << x / y; } catch (int e) { cout << "Error Code: " << e; } catch (const char* msg) { cout << "Caught: " << msg; }

问输出什么?


2、第一步

x=10 y=0

3、第二步

执行:

if(y==0)

成立。

于是:

throw "Zero Error";

4、这里抛出的是什么?

注意!

"Zero Error"

是字符串。

类型:

const char*

不是int!


5、第三步

程序开始寻找:

有没有能接住

const char*

的catch。


(1)第一个:

catch(int e)

接不了。

继续找。


(2)第二个:

catch(const char* msg)

完全匹配!

进入。

执行:

cout<<"Caught: "<<msg;

msg就是:

Zero Error

所以输出:

Caught: Zero Error

六、如果没有catch呢?

1、例如:

try { throw "Error"; }

没有:

catch(...)

那么:

程序直接结束。


2、程序会发现:

"有人把异常扔出来了(throw),但是没有任何人接(catch)!"

(1)于是程序会调用一个系统函数:

std::terminate()

程序就在这里结束了。


(2)很多编译器会看到类似的信息:

terminate called after throwing an instance of ...

或者

terminate called after throwing ...

不同编译器提示略有不同。


3、这算不算"程序崩溃"?

(1)它并不是程序因为内存错误、野指针等原因"崩溃"(Crash)。

而是:

程序因为未处理的异常(Unhandled Exception),被系统终止(Terminate)了。


(2)也就是说:

throw ↓ 没有任何catch ↓ std::terminate() ↓ 程序结束

(3)所以,准确的说法应该是:

程序因为异常没有被处理而终止运行。


七、GESP真题讲解

1、题目:

int divi(int a,int b) { if(b==0) throw 0; return a/b; } int main() { try { cout<<divi(10,0); } catch(const char* msg) { cout<<"A"; } catch(int) { cout<<"B"; } }

(1)第一步

进入:

divi(10,0)

b=0


于是:

throw 0;

注意:

抛出的是什么?

0

它是什么类型?

int

不是字符串。


(2)开始找catch。

第一个:

catch(const char*)

接不了。


第二个:

catch(int)

成功!


(3)执行:

cout<<"B";

输出:

B

八、GESP真题讲解

1、程序:

int divide(int a,int b) { if(b==0) throw "Division by zero"; return a/b; } int main() { int result=0; try { result=divide(10,0); cout<<"A"; } catch(const char* msg) { cout<<"B"; result=-1; } cout<<result; }

2、第一步

执行:

divide(10,0)

b=0

于是:

throw "Division by zero";

3、注意,一旦throw发生。

后面的:

cout<<"A";

不会执行!!

很多同学最容易错这里。

程序已经跳出try。


4、进入:

catch(const char*)

输出:

B

然后:

result=-1;

最后:

cout<<result;

输出:

-1

所以最终:

B-1

答案:

B


九、为什么 throw 后面的代码不执行?

1、例如:

cout<<"开始"; throw 1; cout<<"结束";

很多同学以为:

开始 结束

其实不是。


2、执行到:

throw

程序立刻跳走。

所以:

开始

结束。

后面的全部跳过。


3、可以理解成:

throw ↓ 立刻跳到catch

十、异常处理完整模板

最经典写法:

try { //可能发生危险 } catch(int x) { //处理int异常 } catch(const char* msg) { //处理字符串异常 }

如果可能抛出多种异常,就可以写多个catch


十一、万能接收器

1、如果不知道会抛出什么类型。

可以写:

catch(...) { cout<<"发生未知错误"; }

三个点:

...

表示:

什么异常都接!


2、例如:

try { throw 3.14; } catch(...) { cout<<"万能接收"; }

输出:

万能接收

十二、异常处理流程图

程序开始 │ ▼ try │ ▼ 有没有异常? │ │ 没有 有 │ │ ▼ ▼ 继续执行 throw │ │ ▼ ▼ 结束 找catch │ 找到?──────┐ │ │ 是 否 │ │ ▼ ▼ 执行catch 程序终止 │ ▼ 继续执行后面的代码

十三、记忆口诀

try 看守危险区,throw 报警抛出去,catch 接住来处理,程序安全不崩溃。


十四、课堂练习

第一题

try { throw 5; } catch(int x) { cout<<x; }

输出?

答案:

5

第二题

try { throw "Hello"; } catch(int) { cout<<"A"; } catch(const char* s) { cout<<s; }

输出?

答案:

Hello

第三题

try { cout<<"A"; throw 10; cout<<"B"; } catch(int) { cout<<"C"; }

输出?

分析:

  • 输出A

  • throw 10后立即跳转

  • "B"不会执行

  • 进入catch(int)输出C

答案:

AC

第四题

try { throw "Error"; } catch(...) { cout<<"OK"; }

输出?

答案:

OK

十五、本课总结

今天我们认识了 C++ 的异常处理机制,它就像程序里的“安全警报系统”。

要记住三个关键词:

关键字作用可以理解成
try放可能出错的代码安全监控区
throw抛出异常拉响警报
catch捕获并处理异常消防员

同时牢记四个重要规律:

  1. throw抛出的数据类型,要与catch的类型匹配。

  2. 执行到throw后,try中后面的代码不会继续执行。

  3. 如果没有匹配的catch,程序通常会终止。

  4. catch(...)可以捕获任何类型的异常,是一个“万能接收器”。


对于 GESP 考试而言,最常见的考点就是:

  • 判断throw抛出的类型;

  • 判断哪个catch能成功接住异常;

  • 理解throw后代码是否继续执行;

  • 判断程序最终的输出结果。

只要掌握了这几条规律,这类题目就能快速、准确地完成。


http://www.cnnetsun.cn/news/3411620.html

相关文章:

  • NVRHI着色器与资源绑定:编译期确定的高效渲染工作流
  • 数字复接系统帧同步的FPGA实现与状态机设计
  • Reloaded-II技术深度解析:.NET Core驱动的跨平台模组加载框架架构揭秘
  • 3个核心技巧:深度解析VRM4U插件在UE5.5中的VMC网络适配挑战
  • 麦麦机器人:重新定义AI陪伴的终极解决方案
  • echart中tooltip与legend中的formatter
  • js中toString()和String()区别
  • 攻克JESD204B多ADC同步的确定性延迟挑战
  • iSulad-img与iSulad深度集成:10个实用技巧提升容器部署效率
  • 高速数字电路噪声问题与ISO72x隔离器解决方案
  • 英雄联盟回放播放器终极指南:永久保存和观看任何版本比赛录像
  • 还原论思想与线性代数形式体系的关联、系统建模与复杂性边界...
  • C语言结构体函数指针:实现面向对象编程的基石
  • PD端内部的POE电源变压器
  • Vim命令技巧
  • 全域三极公理统一篇——所有分析、代数、拓扑、算子理论同源归一,回归0/1/∞创世本源闭环《全域数学vs传统数学:人类文明进阶200讲》第91讲
  • C#上位机+ONNX Runtime:毫秒级AI视觉缺陷检测系统落地指南
  • 影刀RPA 数据合并:多表关联与拼接
  • 紧急!新修订《行政规范性文件管理办法》生效前72小时,ChatGPT政策比对工具包限时开放(含12类高频冲突条款识别规则集)
  • HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储
  • HarmonyOs应用《重要日》开发第7篇 - 日期处理:dayjs 集成与 DateUtil 封装
  • LMK61E0M DCXO实战:从I2C配置到环路滤波,打造70.656MHz高精度时钟
  • ArcGIS图层的符号绘制顺序(叠放次序)调整
  • Cursor AI布局切换实战手册(从VS Code迁移者必读):12个真实项目踩坑复盘与标准化配置模板
  • 零基础实战:手把手教你用NoneBot2与go-cqhttp搭建QQ机器人
  • Grok安全机制7日崩塌:大模型安全承诺的工程真相
  • 限时返场开源组件集成实践:风险评估与Spring Boot安全集成指南
  • STL之map与unordered_map:面试考红黑树和哈希表,这样答直接满分
  • DLPC910高速接口与像素映射:从电气设计到数据重排的工程实践
  • 网盘直链下载助手终极实战指南:5倍速下载技巧大公开