C++:异常

ops/2024/9/20 7:13:49/ 标签: 算法, 开发语言, c++, 网络安全

C++ 异常处理机制是一种用于处理程序运行过程中出现异常情况的技术;异常是指程序在运行过程中发生的不正常情况,如除零错误、访问无效内存、文件不存在等。异常处理机制允许程序在发生异常时执行特定的操作,以便使程序更加健壮和可靠。

C++ 中的异常处理主要通过以下关键字和语法实现:

try 块try 块用于包含可能抛出异常的代码块。在 try 块中,程序会监视可能抛出异常的语句,并在异常发生时执行相应的异常处理代码。

catch 块catch 块用于捕获并处理 try 块中抛出的异常。每个 catch 块可以捕获特定类型的异常,并执行相应的异常处理操作。一个 try 块可以有多个 catch 块,每个 catch 块可以捕获不同类型的异常。

throw 表达式throw 表达式用于抛出异常。当程序在 try 块中发生异常时,可以使用 throw 表达式将异常抛出,并传递给相应的 catch 块进行处理。throw 表达式通常携带一个异常对象,该异常对象可以是任意类型,通常是异常类的对象。

示例:此时我代码中存在内存超出异常

int main() {
​for (int i = 0; i < 10000; i++) {int * nPtr = new int[999999]; //内存超出:内存不足而无法完成分配时抛出的异常}
​system("pause");return 0;
}

此时运行程序,会抛出对应异常:

如果此时我要对程序运行过程中出现异常情况进行抑制或处理,

int main() {//异常代码处理try{for (int i = 0; i < 10000; i++) {int * nPtr = new int[999999];}
​}catch (...){std::cout << "发生异常" << std::endl;}system("pause");return 0;
}

在代码中使用了异常处理机制,通过 try 块来监视可能抛出的异常,而 catch 块用于捕获并处理异常。然而,在这段代码中,异常处理部分仅有 catch (...),表示捕获任何类型的异常,而没有特定类型的异常对象来捕获。此时程序运行结果:

但是如果此时发生的异常为除以0异常,异常处理代码块则不会正常进行处理。

int main() {
​try{int a = 10;int b = 0;int res = a / b;
​}catch (...){std::cout << "发生异常" << std::endl;}system("pause");return 0;
}

原因是C++ 中除以零异常会触发浮点数异常,而不是抛出一个标准的 C++ 异常;C++ 中的异常处理机制只能捕获和处理抛出的标准异常,比如 std::bad_alloc 等。而对于浮点数异常,C++ 并不会将其视为标准异常来处理,而是通过特定的机制来处理。这个时候我们可以手动对除以0异常进行检测处理,使用Throw块进行异常抛出,接着使用catch块尝试捕获异常;

int Div(int a, int b) {if (b == 0) {throw 1000; //抛出整型异常1000}
​return a / b;
}
​
int main() {
​try{int a = 10;int b = 0;int res = Div(a,b);
​}//捕获整型异常catch (int exception){std::cout << exception << ":发生异常" << std::endl;}
​system("pause");return 0;
}

Div 函数:这个函数进行两个整数的除法;如果除数 b 为0,则通过 throw 1000; 抛出一个整数值作为异常,一旦抛出异常,函数会立即退出并跳转到最近的catch块(如果存在)。

main 函数中的 try-catch 块:try 块中调用了 Div 函数,并 Div 函数中的抛出整数值作为异常,则可以使用catch (int exception)捕获这个整数值异常。

程序运行结果:

字符串也可以作为抛出的异常

int Div(int a, int b) {if (b == 0) {throw "发生除以0异常";  //抛出字符串作为异常}
​return a / b;
}
​
int main() {
​try{int a = 10;int b = 0;int res = Div(a,b);}//尝试捕获异常catch (const char * cException){std::cout << cException << ":发生异常" << std::endl;}system("pause");return 0;
}

Div 函数中,首先检查除数是否为零。如果除数 b 等于零,则使用 throw 关键字抛出一个字符串类型的异常,表示发生除以零异常;否则,继续执行除法操作,返回结果。

main 函数中,使用 try 块包裹调用 Div 函数的代码。如果在调用 Div 函数时发生了除以零的异常,则会被 catch 块捕获。catch 块中的代码会打印异常信息,并继续执行程序的其他部分,最后程序执行结果:


http://www.ppmy.cn/ops/41483.html

相关文章

CheckStyle静态样式之道

优质博文&#xff1a;IT-BLOG-CN 在标准化的统一样式检查规范里&#xff0c;最为常用的统一样式工具是checkstyle插件&#xff0c;而不是国内阿里的代码规约插件。 【1】下载插件 【2】配置生效 配置生效及告警设置 【3】配置checkstyle.xml 官网地址 官网最新Releases 下面…

论文阅读记录--关于水文系统的传递函数

文章目录 J-schuite的文章,地下水系统的响应的功率谱分析--传递函数1. 什么是冲激响应函数与传递函数?2. 地下水流系统中传递函数的求解3. J-schuite文章中传递函数的复现J-schuite的文章,地下水系统的响应的功率谱分析–传递函数 1. 什么是冲激响应函数与传递函数? 在信号…

一篇搞懂Web3那些东西

目录 Web3 区块链 加密货币 Web3钱包 以太坊 智能合约 DAPP 身为开发人员&#xff0c;直活在web2.0有什么意思&#xff0c;于是我打算一下子弄懂Web3.0这些东西。无论你的前端还是后端我觉得都值得一看&#xff01; Web3 Web3 已成为一个包罗万象的术语&#xff0c;代…

nginx相关配置及高并发优化

TOC 早期的业务都是基于单体节点部署&#xff0c;由于前期访问流量不大&#xff0c;因此单体结构也可满足需求&#xff0c;但随着业务增长&#xff0c;流量也越来越大&#xff0c;那么最终单台服务器受到的访问压力也会逐步增高。时间一长&#xff0c;单台服务器性能无法跟上业…

以管理员身份运行设置

在使用非 Administrator 用户操作情况下&#xff1a; 举个例子&#xff0c;因为每次想要以管理员身份运行命令提示符&#xff0c;都要右键选择才行&#xff0c;有点麻烦。 可以设置每次点开就是以管理员身份运行命令提示符&#xff0c;操作如下&#xff1a; 1.Win R 输入 s…

IPSSL证书:为特定IP地址通信数据保驾护航

IPSSL证书&#xff0c;顾名思义&#xff0c;是专为特定IP地址设计的SSL证书。它不仅继承了传统SSL证书验证网站身份、加密数据传输的基本功能&#xff0c;还特别针对通过固定IP地址进行通信的场景提供了强化的安全保障。在IP地址直接绑定SSL证书的模式下&#xff0c;它能够确保…

Visual Studio C++ 2019进行安装

Visual Studio C 2019进行下载安装 链接&#xff1a;https://my.visualstudio.com/Downloads?qvisual%20studio%202017&wt.mc_idomsftvscom~older-downloads

5.9网络协议

由网卡发送数据通过网线进行发送&#xff0c;当网卡接收到信号以后将数据传给内核数据区&#xff0c;然后由操作系统交给相应的进程。 将数据进行发送的时候需要借助于网线实现&#xff0c;这个时候会出现当传输的数据比较远的时候就借助于中继器将信号进行再生扩大&#xff0…

图文详解JUC:Wait与Sleep的区别与细节

目录 一.Wait() 二.Sleep() 三.总结Wait()与Sleep()的区别 一.Wait() 在Java中&#xff0c;wait() 方法是 Object类中的一个方法&#xff0c;用于线程间的协作。当一个线程调用wait() 方法时&#xff0c;它会释放对象的锁并进入等待状态&#xff0c;直到其他线程调用相同对…

GPT-4o API 全新版本发布:提升性能,增加性价比

5月13日&#xff0c;OpenAI 发布了全新ChatGPT模型 GPT-4o&#xff0c;它在响应速度和多媒体理解上都有显著提升。在这篇文章中&#xff0c;我们将介绍 GPT-4o 的主要特点及其 API 集成方式。 什么是 GPT-4o&#xff1f; GPT-4o 是 OpenAI 于5月13日发布的最新多模态 AI 模型…

软件3班20240513

java.util.PropertyResourceBundle4554617c package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) throws SQLException { // 获取属性配置文件ResourceBundle bundle Res…

SpringMVC 注解详解

SpringMVC 注解详解 1. 引言 SpringMVC 是 Spring 框架中的 Web 层解决方案&#xff0c;它通过注解的方式来简化 MVC 模式的实现。本篇将详细介绍 SpringMVC 中常用的注解及其用法。 2. SpringMVC 注解分类 SpringMVC 的注解主要分为以下几类&#xff1a; 2.1 核心注解 C…

qt 麒麟系统 connot find /usr/local/lib

目录 解决方法&#xff1a; 后来又报错&#xff1a; cannot find -lopencv_world3.4.6 connot find /usr/local/lib 解决方法&#xff1a; LIBS -L/usr/local/lib -lopencv_world3.4.6QMAKE_LFLAGS -Wl,-rpath,/usr/local/lib 后来又报错&#xff1a; cannot find -lopencv…

软件测试面试78问

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、问&#xff1a;你在测试中发现了一个bug&#xff0c;但是开发经理认为这不是一个bug&#xf…

Pycharm所有快捷键的使用

1.编辑 快捷键作用Ctrl Space基本的代码完成&#xff08;类、方法、属性&#xff09;Ctrl Alt Space快速导入任意类Ctrl Shift Enter语句完成Ctrl P参数信息&#xff08;在方法中调用参数&#xff09;Ctrl Q快速查看文档Shift F1外部文档Ctrl 鼠标简介Ctrl F1显示错…

从零开始详解OpenCV条形码区域分割

前言 在识别二维码之前&#xff0c;首先要划分出二维码的区域&#xff0c;在本篇文章中将从零开始实现二维码分割的功能&#xff0c;并详细介绍用到的方法。 我们需要处理的图像如下&#xff1a; 完整代码 首先我们先放出完整代码&#xff0c;然后根据整个分割流程介绍用到…

[自动化]pyautogui的使用

目录 环境 包的版本 前置知识 鼠标控制函数 屏幕与鼠标位置 size() position() OnScreen() 鼠标移动 moveTo() move() 鼠标拖动 dragTo() drag() mouseDown()按下鼠标 mouseUp()松开鼠标 鼠标滚动 scroll() 键盘控制函数 write() press() keyDown()和keyU…

wireshark_概念

ARP (Address Resolution Protocol&#xff09;协议&#xff0c;即地址解析协议。该协议的功能就是将IP地址解析成MAC地址。 混杂模式 抓取经过网卡的所有数据包&#xff0c;包括发往本网卡和非发往本网卡的。 非混杂模式 只抓取目标地址是本网卡的数据包&#xff0c;对于发往…

前端 JS 经典:CommonJs 规范

1. Node 环境介绍 CommonJs 简称 CMJ&#xff0c;CMJ 的模块标准&#xff0c;必须在 node 的环境中才支持。在浏览器中用&#xff0c;是不行的。 查看电脑是否安装 node&#xff0c;通过打开终端&#xff0c;运行 node -v 查看是否返回 node 版本。返回则已安装。 CMJ 在 no…

数据结构之----树

树 结点拥有的子树数量称为结点的度 树中结点的最大层次称为树的深度或高度 如果将树中结点的各子树看成从左至右是有次序的&#xff0c;不能互换的&#xff0c;则称该树为有序树&#xff0c;否则称无序树 森林是m棵互不相交的树的集合 树的存储结构 1&#xff0c;双亲表示法…