C++ 异常处理
C++ 异常(Exception)是指在程序运行时产生的特殊情况,例如,尝试除以零的操作。异常提供了一种转移程序控制权的方式,异常处理涉及到三个关键字:try、catch、throw。
- throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
- catch: 在想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
- try: try 块中的代码标识将抛出被激活的特定异常,它后面通常跟着一个或多个 catch 块。
如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。
抛出异常
可以使用 throw 语句在代码块中的任何地方抛出异常,throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。以下是尝试除以零时抛出异常的实例:
double division(int a, int b)
{if( b == 0 ){throw "Division by zero condition!";}return (a/b);
}
捕获异常
catch 块跟在 try 块后面,用于捕获异常。可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。 使用 try/catch 语句的语法如下所示:
try
{program-statements // 保护代码
}catch( Exception—declaration ) {handler-statements // 处理 Exception—declaration 异常的代码
}catch( Exception—declaration ) {handler-statements
}catch( Exception—declaration ) {handler-statements
} //...
下面是一个实例,抛出一个除以零的异常,并在 catch 块中捕获该异常。
#include <iostream>
using namespace std;double division(int a, int b)
{if( b == 0 ){throw "Division by zero condition!";}return (a/b);
}int main ()
{int x = 50;int y = 0;double z = 0;try {z = division(x, y);cout << z << endl;}catch (const char* msg) {cerr << msg << endl;}return 0;
}
程序抛出了"Division by zero condition!",一个类型为 const char* 的异常,因此,catch 块中使用 const char*。
编译和执行上面的代码:
Division by zero condition!
若 try 块在不同的情境下会抛出不同的异常时,可以罗列多个 catch 语句,用于捕获不同类型的异常。若让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,如下所示:
try
{program-statements
}catch(...) {handler-statements
}
标准的异常
C++ 提供了一系列定义在 <exception> 中,可以在程序中使用的标准的异常,以父子类层次结构组织起来,如下所示:

每个异常的说明:
| 异常 | 描述 |
|---|---|
| std::exception | 该异常是所有标准 C++ 异常的父类。 |
| std::bad_alloc | 该异常可以通过 new 抛出。 |
| std::bad_cast | 该异常可以通过 dynamic_cast 抛出。 |
| std::bad_typeid | 该异常可以通过 typeid 抛出。 |
| std::bad_exception | 这在处理 C++ 程序中无法预期的异常时非常有用。 |
| std::logic_error | 理论上可以通过读取代码来检测到的异常。 |
| std::domain_error | 当使用了一个无效的数学域时,会抛出该异常。 |
| std::invalid_argument | 当使用了无效的参数时,会抛出该异常。 |
| std::length_error | 当创建了太长的 std::string 时,会抛出该异常。 |
| std::out_of_range | 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。 |
| std::runtime_error | 理论上不可以通过读取代码来检测到的异常。 |
| std::overflow_error | 当发生数学上溢时,会抛出该异常。 |
| std::range_error | 当尝试存储超出范围的值时,会抛出该异常。 |
| std::underflow_error | 当发生数学下溢时,会抛出该异常。 |
定义新的异常
通过继承和重载 exception 类来定义新的异常。下面的实例演示如何使用 std::exception 类来实现自己的异常:
#include <iostream>
#include <exception>
using namespace std;class MyException : public exception
{
public:const char * what() const throw () // 成员函数声明后跟上throw(),表示函数不会抛出异常{ return "C++ Exception";}
};int main()
{try{throw MyException();} catch(MyException& e) {cout << "MyException caught" << endl;cout << e.what() << endl;} catch(std::exception& e) {//其他的错误}return 0;
}
what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因。编译和执行上面的代码:
MyException caught
C++ Exception
补充: throw() 是异常规格说明,目的是为了让函数使用者知道该函数可能抛出的异常有哪些,可以在throw()函数的参数声明中列出这个函数可能抛掷的所有异常类型。
在 C++11 中,可以使用关键字 noexcept声明一个函数不会抛出任何异常。
void what() noexcept;
下面两个函数声明的异常规格在语义上是相同的,都表示函数不抛出任何异常。
void what() throw();
void what() noexcept;
throw函数后面的意义:
- 函数后面跟throw(),表示该函数不会抛出异常,函数是异常安全的
- 函数后面跟throw(...),表示该函数可能会抛出任何形式的异常
- 函数后面跟throw(exception type),表示该函数只抛出exception type类型的异常
const在函数后面的意义:
- 只允许在类的非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误);
- 后面加的const是对this指针指向的类的对象的修饰,即修饰 *this,所以this所指向的类对象的成员都是不允许被修改的;
相关文章:
C++ 异常处理
C 异常(Exception)是指在程序运行时产生的特殊情况,例如,尝试除以零的操作。异常提供了一种转移程序控制权的方式,异常处理涉及到三个关键字:try、catch、throw。 throw: 当问题出现时,程序会抛出一个异常。这是通过…...
OJ练习第157题——单词拆分
单词拆分 力扣链接:139. 单词拆分 题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 …...
若依tab-content面板失效、使用load的解决方法(附详细步骤)
【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】【创作不易,点个赞就是对我最大的支持】 前言 仅作为学习笔记,供大家参考 总结的不错的话,记得点赞收藏关注哦! 思路&…...
2023年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:拼点游戏 C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌,每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌,S随机抽取n张蓝色卡牌,他们进行n回合拼点,每次两人各出一张卡牌,点数大者获…...
Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)
Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末🐕🐕🐕) 一.项目运行介绍 B站演示…...
Hadoop 3.2.4 集群搭建详细图文教程
目录 一、集群简介 二、Hadoop 集群部署方式 三、集群安装 3.1 集群角色规划 3.2 服务器基础环境准备 3.2.1 环境初始化 3.2.2 ssh 免密登录(在 hadoop01 上执行) 3.2.3 各个节点上安装 JDK 1.8 环境 3.3 安装 Hadoop 3.4 Hadoop 安装包目…...
STL的学习之一
1)STL扫盲 1)C标准库和标准模板库是不一样的 2)标准模板库是用泛型编程方式编写的函数或者类库; 3) SGI STL linux一般用,P.J.Plauger STL,visual2017 windows用 STL六大组件 : 容器,迭代器 STL 算法(说白了就是函数…...
如何使用Python进行数据科学实验?
使用Python进行数据科学实验通常需要以下步骤: 以上仅为使用Python进行数据科学实验的基本步骤,具体实验过程会根据具体问题和数据集的特点而有所不同。可以进一步学习和探索相关的数据科学和机器学习技术,以提高实验的效果和表现。 安装Pyt…...
华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)
以下是我在现有题库中整理的需要重点关注的考点内容,如有遗漏小伙伴可以留言补充。...
第三课:C++实现PDF去水印
PDF去水印是一项非常复杂的任务,需要一定的计算机图形学知识和技术,也需要使用到一些专业的工具库。以下是一种可能的实现方法: 首先,需要将PDF文件解析成一系列图形元素,包括文字、矢量图形等。可以使用开源库Poppler或MuPDF来解析PDF文件。 接下来,需要判断PDF文件是否…...
实现Android分布式协同办公:将待办事件App与本地Web服务结合
AndServer AndServer 是 Android 平台的 Web Server 和 Web Framework,它基于编译时注解提供了类似 SpringMVC 的注解和功能。 Github :https://github.com/yanzhenjie/AndServer使用文档:https://yanzhenjie.com/AndServer/业务需求 实现待办事件APP本地启动Web服务,将本…...
VMware12.1.1安装Centos7
VMware12.1.1安装Centos7 1、下载相关软件 1.1 Centos7下载 官方下载链接: http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso 1.2 VMware Workstation下载 VMware Workstation 12.1.1官方原版下载: https://dow…...
bazel构建原理
调度模型 传统构建系统有很多是基于任务的,例如 Ant,Maven,Gradle。用户可以自定义"任务"(Task),例如执行一段 shell 脚本。用户配置它们的依赖关系,构建系统则按照顺序调度。 基于 Task 的调度…...
matlab 点云的二进制形状描述子
目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码示例三、结果展示四、参数解析输入参数名称-值对应参数输出参数五、参考链接本文由CSDN点云侠原创,...
MongoDB实验——在Java应用程序中操作 MongoDB 数据
在Java应用程序中操作 MongoDB 数据 1. 启动MongoDB Shell 2. 切换到admin数据库,使用root账户 3.开启Eclipse,创建Java Project项目,命名为MongoJava File --> New --> Java Project 4.在MongoJava项目下新建包,包名为mo…...
java+springboot+mysql校园跑腿管理系统
项目介绍: 使用javaspringbootmysql开发的校园跑腿管理系统,系统包含超级管理员,系统管理员、用户角色,功能如下: 超级管理员:管理员管理;用户管理(充值);任…...
ubuntu20.04 server 安装后磁盘空间只有一半的处理
这里扩展:/dev/mapper/ubuntu–vg-ubuntu–lv rootbook:/data# df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 795M 1.2M 79…...
〔017〕Stable Diffusion 之 常用模型推荐 篇
✨ 目录 🎈 模型网站🎈 仿真系列🎈 国风系列🎈 卡通动漫系列🎈 3D系列🎈 一些好用的lora模型🎈 模型网站 由于现在大模型超级多,导致每种画风的模型太多,那么如何选择最好最适合的模型,成了很多人头疼的问题由于用的大部分都是1.5的模型,所以优先下载 safete…...
多目标应用:基于多目标人工蜂鸟算法(MOAHA)的微电网多目标优化调度MATLAB
一、微网系统运行优化模型 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标人工蜂鸟算法MOAHA 多目标人工蜂鸟算法(multi-objective artificial hummingbird algorithm&…...
【HTML5】HTML5 特性
HTML5 特性 1. 语义化标签 <header>:表示网页或某个区域的页眉部分,通常包含网站的标志、导航菜单等内容。<nav>:表示导航区域,用于包含网站的主要导航链接。<main>:表示网页的主要内容区域&#…...
(ubuntu黑屏)Z890M + U7 265KF + RTX 5070 Ti 安装 Ubuntu 22.04.5 实战记录(网卡 + 显卡驱动全解)
本文记录了在技嘉 Z890M Intel Core Ultra 7 265KF RTX 5070 Ti 新平台上,成功安装 Ubuntu 22.04.5 并解决网卡、显卡驱动问题的完整过程,适合同类配置参考。一、硬件环境组件型号主板技嘉 Z890M 小雕(带 WiFi)CPUIntel Core Ul…...
离散状态观测器
-伺服(实用)A川伺服--模型追踪控制(末端低频振动抑制-pmsm 完全自己搭建,原理清晰,效果可靠,可实际验证包含: (1)详细原理性推导 (2)仿真基于离散化模型以及离…...
【渗透测试】HTB靶场之Lock 全过程wp
息收集 目标ip:10.129.234.64 kali ip:10.10.16.4 ┌──(root㉿kali)-[~/桌面/HTB]└─# nmap -A -T4 10.129.234.64 Starting Nmap 7.95 ( https://nmap.org ) at 2026-02-15 01:34 ESTNmap scan report for 10.129.234.64Host is up (0.30s latency).Not shown: 996 filte…...
下一代嵌入式开发架构实战:基于Rust与STM32F4 HAL的安全高效系统设计
下一代嵌入式开发架构实战:基于Rust与STM32F4 HAL的安全高效系统设计 【免费下载链接】Awesome-Embedded A curated list of awesome embedded programming. 项目地址: https://gitcode.com/gh_mirrors/aw/Awesome-Embedded 在传统嵌入式开发中,开…...
Qwen3-0.6B-FP8辅助Java八股文学习:智能抽题与答案要点生成
Qwen3-0.6B-FP8辅助Java八股文学习:智能抽题与答案要点生成 1. 引言:当面试备考遇上AI 准备Java面试,尤其是那些经典的“八股文”题目,对很多程序员来说是个既熟悉又头疼的过程。你可能也经历过:面对厚厚的面试宝典&…...
实战指南:如何用PyMC实现贝叶斯分位数回归解决业务预测难题
实战指南:如何用PyMC实现贝叶斯分位数回归解决业务预测难题 【免费下载链接】pymc Python 中的贝叶斯建模和概率编程。 项目地址: https://gitcode.com/GitHub_Trending/py/pymc 你是否曾面临这样的困境:使用传统线性回归预测客户流失率ÿ…...
别再死记硬背了!用‘神经元工作原理’理解你背单词为什么总忘
别再死记硬背了!用‘神经元工作原理’理解你背单词为什么总忘 背单词时总是前脚记后脚忘?这其实不是记忆力的问题,而是方法的问题。我们的大脑就像一台精密的生物计算机,而记忆的形成和巩固遵循着特定的神经科学规律。理解这些规…...
Flappy Bird AI训练避坑指南:为什么你的DQN模型总是‘撞墙’?
Flappy Bird AI训练避坑指南:为什么你的DQN模型总是‘撞墙’? 在强化学习领域,Flappy Bird这个小游戏因其简单的规则和复杂的决策过程,成为了检验算法效果的经典测试平台。然而许多开发者在尝试用DQN(深度Q网络&#x…...
从轮胎变形到车辆漂移:深入浅出聊聊自动驾驶横向控制里的‘侧偏刚度’
轮胎侧偏刚度:自动驾驶横向控制中的隐形弹簧 想象一下在高速公路上以120km/h的速度变道时,方向盘只需轻轻转动几度——这种看似反直觉的操控背后,是轮胎侧偏刚度在默默发挥着作用。就像跳水运动员入水时水面产生的弹性变形一样,轮…...
handong1587.github.io:深度学习工程师的终极技术资源宝库
handong1587.github.io:深度学习工程师的终极技术资源宝库 【免费下载链接】handong1587.github.io 项目地址: https://gitcode.com/gh_mirrors/ha/handong1587.github.io 在当今人工智能和深度学习快速发展的时代,寻找高质量的技术资源变得至关…...
