【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

文章目录

  • 一、异常处理
    • 1、异常概念引入
    • 2、抛出异常语法
    • 3、捕获异常语法
    • 4、异常捕获流程
  • 二、异常处理代码示例
    • 1、错误代码示例 - 抛出异常 / 不捕获异常
    • 2、正确代码示例 - 抛出异常 / 捕获异常
    • 3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常





一、异常处理




1、异常概念引入


异常是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ;

当程序执行错误时 , 由 throw 关键字抛出异常 , 并即跳转到相应的异常处理程序中 ; 如果没有适当的异常处理程序处理该异常 , 程序会崩溃终止 ;


异常与函数对比 :

  • 函数 是一种 以 栈结构 展开的上下函数衔接的程序控制系统 ;
  • 异常 是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ; 异常 依附于栈结构 , 却可以同时设置多个 异常类型 作为 异常捕获条件 ;

异常是跨函数的 , 下图中 函数 f 调用 函数 g , 函数 g 调用 函数 h ;
在这里插入图片描述
在 函数 h 中抛出异常 , 异常会沿着函数 调用顺序 , 先抛给 函数 g , 如果 g 不处理 , 则继续向上抛给 函数 f ;

上述 异常处理 机制 , 可以在不同的函数中 进行 抛出异常 和 处理异常 的操作 ;

这样 函数设计开发时 只需要解决具体的问题 , 不需要过多考虑 异常处理 ;


2、抛出异常语法


抛出异常 语法 : 使用 throw 关键字 , 抛出异常对象 ;

throw 异常对象;

代码示例 : 在下面的函数中 , 抛出一个 int 类型的异常 ;

// 1. 在 函数 中 抛出异常
void fun(int a) {if (a == 0) {// 抛出一个 int 类型的异常throw 2;}
}

3、捕获异常语法


异常捕获 语法 : 在 try 代码块中执行 可能抛出异常的 代码 , 如果出现异常 , 就可以在 catch 分支中进行捕获 ;

try {// 出现异常的代码块
} catch( 异常类型声明 )

代码示例 : 下面的代码中 , 捕获 try 代码块中产生的异常 ,

  • 如果捕获到 int 类型的异常 , 则执行 catch (int e) 分支中的代码 ,
  • 如果捕获到其它类型的异常 , 则执行 catch ( … ) 分支中的代码 ;
	// 2. 捕获并处理异常try{// 调用可能产生异常的函数fun(0);}catch (int e){cout << "捕获到异常 : " << e << endl;}catch ( ... ){// 捕获 ... 可以捕获未知其它类型的异常cout << "捕获到未知类型异常"<< endl;}

4、异常捕获流程


异常捕获流程 :

  • 抛出异常 : 如果遇到错误 , 需要抛出异常 , 可以使用 throw 关键字 , 抛出一个异常对象 , 这个异常对象可以是任意类型 , 如 int 类型 ;
  • try 代码块处理异常 : 在 try 代码块中 , 执行可能抛出异常的代码 , 上方的代码顺序执行到达 try 代码块时 , 则进入 try 代码块 继续执行其中的代码 ;
    • 正常执行 : 如果 try 保护段代码正常执行 , 没有出现异常 , 则执行完毕后继续执行 后续代码 , 最后一个 catch 分支之后的代码 ;
    • 出现异常 :
      • 捕获异常 : 如果出现了异常 , 恰好被 catch 分支捕获 , 则执行 catch 分支代码 ;
        • 处理异常 : 如果能处理该异常 , 则处理异常错误 ;
        • 继续向上抛出异常 : 如果无法处理 , 则继续向上抛出给调用者 , 让上一级函数处理 ;
      • 未捕获异常 : 如果出现了异常 , 没有被 catch 分支捕获 , 则运行 terminate 函数 , 在该函数中调用 abort 终止程序 ;




二、异常处理代码示例




1、错误代码示例 - 抛出异常 / 不捕获异常


错误代码示例 : 在下面的代码中 , 没有捕获异常 , 则在执行时会报错 : " 0x755FF932 处(位于 HelloWorld.exe 中)有未经处理的异常 " ;

#include "iostream"
using namespace std;// 1. 在 函数 中 抛出异常
void fun(int a) {if (a == 0) {// 抛出一个 int 类型的异常throw 2;}
}int main() {// 调用可能产生异常的函数fun(0);// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

0x755FF932(位于 HelloWorld.exe 中)有未经处理的异常: 
Microsoft C++ 异常: int,位于内存位置 0x00F6FB6C 处。 

在这里插入图片描述


2、正确代码示例 - 抛出异常 / 捕获异常


异常捕获完整代码示例 :

#include "iostream"
using namespace std;// 1. 在 函数 中 抛出异常
void fun(int a) {if (a == 0) {// 抛出一个 int 类型的异常throw 2;}
}int main() {// 2. 捕获并处理异常try{// 调用可能产生异常的函数fun(0);}catch (int e){cout << "捕获到异常 : " << e << endl;}catch ( ... ){// 捕获 ... 可以捕获未知其它类型的异常cout << "捕获到未知类型异常"<< endl;}// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

捕获到异常 : 2
请按任意键继续. . .

在这里插入图片描述


3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常


异常是跨函数的 , 异常会从本函数中抛给调用本函数的调用者 ( 调用函数 ) ;

  • 如 : 在 main 函数中调用 fun 函数 , 如果 fun 函数中抛出异常 , 则抛给了 main 函数 , 需要在 main 函数中捕获并处理异常 ;

在下面的示例中 , fun2 函数中捕获 fun 函数中的 异常未处理 , 抛到了 main 函数中 ;

main 函数中的异常必须处理 , 否则程序崩溃 ;


代码示例 :

#include "iostream"
using namespace std;// 1. 在 函数 中 抛出异常
void fun(int a) {if (a == 0) {// 抛出一个 int 类型的异常throw 2;}
}// 3. 捕获异常不处理 , 继续向上抛出
void fun2(int a) {try{// 执行可能抛出异常的函数fun(a);}catch (int e){// 捕获到了异常, 但是不处理继续向上抛出throw;}}int main() {// 2. 捕获并处理异常try{// 调用可能产生异常的函数//fun(0);// 异常是跨函数的// 调用可能产生异常的函数// 该 fun2 函数中捕获 fun 函数中的 异常未处理 // 抛到了 main 函数中fun2(0);}catch (int e){cout << "捕获到异常 : " << e << endl;}catch ( ... ){// 捕获 ... 可以捕获未知其它类型的异常cout << "捕获到未知类型异常"<< endl;}// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

捕获到异常 : 2
请按任意键继续. . .

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面向对象第8天

精华笔记&#xff1a; 接口&#xff1a; 是一种引用数据类型 由interface定义 只能包含常量和抽象方法 不能被实例化 接口是需要被实现/继承的&#xff0c;实现类/派生类&#xff1a;必须重写接口中的所有抽象方法 一个类可以实现多个接口&#xff0c;用逗号分隔。若又继承…

接口测试入门8问(含答案+文档)

Q1&#xff1a;什么是接口测试&#xff0c;基础知识什么的讲讲吧&#xff01; A&#xff1a;你好&#xff0c;接口可以分下面几种 1、系统与系统之间的调用&#xff0c;比如银行会提供接口供电子商务网站调用&#xff0c;或者说&#xff0c;支付宝会提供接口给淘宝调用 2、上…

Table和HashBasedTable的使用案例

------------------- 1.普通使用 package org.example.testhashbasedtable;import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table;import java.util.Map;public class TestHashBasedTable {public static void main(String[] args) {Ta…

【方法】PowerPoint如何删除“限制编辑”?

如果PPT文件设置成“只读模式”&#xff0c;就会被限制编辑&#xff0c;也就是无法对PPT进行编辑或更改&#xff0c;那要如何删除这个“限制”呢&#xff1f; 下面小编会按照“无密码的只读方式”、“有密码的只读方式”以及“忘记了密码的只读方式”这3种情况&#xff0c;来说…

enote笔记法之附录2——5w1h2k关联词(ver0.22)

enote笔记法之附录2——5w1h2k关联词&#xff08;ver0.22&#xff09; 最上面的是截屏的完整版&#xff0c;分割线下面的是纯文字版本&#xff1a; 作者姓名&#xff08;本人的真实姓名&#xff09;&#xff1a;胡佳吉 居住地&#xff1a;上海 作者网名&#xff1a;EverSt…

【从删库到跑路 | MySQL总结篇】表的增删查改(进阶下)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、联合…

【接口技术】实验3:可编程并行接口8255

实验3 可编程并行接口8255实验 一、实验目的 1&#xff1a;了解8255芯片结构及编程方法。 2&#xff1a;了解8255输入/输出实验方法。 3&#xff1a;掌握8255控制键盘及显示电路的基本功能及编程方法。 4&#xff1a;掌握一般键盘和显示电路的工作原理。 二、实验内容 1&…

WS2812灯条基于WLED开源项目无门槛使用简介

WS2812灯条基于WLED开源项目无门槛使用简介 &#x1f4cc;项目github地址&#xff1a;https://github.com/Aircoookie/WLED&#x1f4cd;WLED详情地址&#xff1a;https://kno.wled.ge/&#x1f388;网页在线烧录固件地址&#xff1a;https://install.wled.me/ ✨ 仅作为使用的…

linux查询某个进程使用的内存量

linux查询某个进程使用的内存量 查进程用的内存&#xff0c;查看进程占用的内存量&#xff0c;centos查询内存使用 查某个进程id使用的内存量 ps -p 24450 -o rss | awk {print int($1/1024)"MB"} 该命令的含义是&#xff1a; ps -p 24450: 查找进程ID为24450的进…

Nginx漏洞复现与分析

Nginx如何处理PHP请求 Nginx本身不支持直接解析和执行PHP代码,但可以通过与PHP解释器的集成来处理PHP请求。一种常见的方法是使用PHP-FPM(FastCGI Process Manager)作为PHP解释器。 原理图: Step 1 Step 2 +---------------------+ …

安全技术与防火墙

目录 一、安全技术 1、安全技术 2、防火墙的分类 二、netfilter 1、netfilter简述 2、防火墙工具 1.iptables工具 2.netfilter的四表五链 3.内核中数据包的传输过程 4.三种报文流向 5.实操 总结&#xff1a;本章主要介绍了安全技术与防火墙 一、安全技术 1、安全技…

天拓四方分享:危化品企业如何搭建安全生产风险预警防控平台?

危化品企业作为高风险行业&#xff0c;其安全生产问题一直备受关注。为了有效预防和控制危化品企业在生产过程中可能出现的安全风险&#xff0c;提高企业的安全性和稳定性&#xff0c;搭建一套有效的安全生产风险预警防控平台势在必行&#xff0c;通过平台实现危化品生产、储存…

【C 语言经典100例】C 练习实例1

题目&#xff1a;有 1、2、3、4 四个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、个位的数字都是 1、2、3、4&#xff0c;组成所有的排列后再去掉不满足条件的排列。 #include<std…

解决Unable to preventDefault inside passive event listener invocation.报错

报错信息&#xff1a; 这个报错大致说的是&#xff1a;无法在被动事件侦听器调用中防止Default 查了其他博主的解决办法&#xff1a;比如&#xff1a; 1、声明事件监听的时候设置为主动事件监听&#xff1a; window.addEventListener(‘touchmove’, handler, { passive: fal…

西南科技大学模拟电子技术实验一(常用电子仪器的使用及电子元器件的识别)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元 1、用万用表电阻挡测量实验板(箱)上电位器(可调电阻)的参数范围。 0~1kΩ电阻: 1k*0%=0 1k*100%=1k 所以范围为0~1k 0~10kΩ电阻: 10k*0%=0 10k*…

Javase | Java题目、Java算法题(不断添加中…)

目录: Java算法题1. 编写Java程序&#xff0c; 打印几个特定的ASCII码&#xff0c;包括数组0和9,大写字母A和Z ,小写字母a和z2.编写程序&#xff0c;对是哪个整型变量进行排序&#xff0c;按照从小到大的顺序排列3.用if语句的嵌套&#xff0c;根据学生成绩判断等级4.用switch语…

【软件测试学习】—软件测试模型(二)

【软件测试学习】—软件测试模型&#xff08;二&#xff09; 我 | 在这里 &#x1f469;‍&#x1f9b0;&#x1f469;‍&#x1f9b0; 读书 | 长沙 ⭐计算机科学与技术 ⭐ 本科 【2024届】 &#x1f383;&#x1f383; 爱好 | 旅游、跑步、网易云、美食、摄影 &#x1f396;️…

Uniapp iOS打包配置教程

简介 在Uniapp开发过程中,我们常常需要将应用打包成iOS的安装包。本文将分步骤指导你如何配置iOS打包,并提供相应的代码和注释说明。 流程概览 下表展示了配置iOS打包的整个流程: 步骤描述步骤1创建iOS工程步骤2配置基本信息步骤3添加Uniapp支持步骤4配置App图标步骤5配置…

VR特警野外武装仿真虚拟训练实操教学保证训练效果

特警VR模拟仿真训练软件的优势主要体现在以下几个方面&#xff1a; 真实感和沉浸感&#xff1a;通过VR技术&#xff0c;特警可以在虚拟环境中体验真实的训练场景&#xff0c;如人质解救、反恐行动等。这种真实感和沉浸感可以帮助特警更好地理解和适应实际情况&#xff0c;提高训…

GoLang切片

一、切片基础 1、切片的定义 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列它是基于数组类型做的一层封装它非常灵活&#xff0c;支持自动扩容切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量声明切片类型的基本语法如下&#…