C++ 异常处理

news2024/11/24 19:58:25

异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。

异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw

  • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
  • try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。使用 try/catch 语句的语法如下所示:

如果 try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。

抛出异常

您可以使用 throw 语句在代码块中的任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。

以下是尝试除以零时抛出异常的实例:

 

捕获异常

catch 块跟在 try 块后面,用于捕获异常。您可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

 上面的代码会捕获一个类型为 ExceptionName 的异常。如果您想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,如下所示:

 下面是一个实例,抛出一个除以零的异常,并在 catch 块中捕获该异常。

由于我们抛出了一个类型为 const char* 的异常,因此,当捕获该异常时,我们必须在 catch 块中使用 const char*。当上面的代码被编译和执行时,它会产生下列结果:

Division by zero condition!

C++ 标准的异常

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;

struct MyException : public exception

{

const char * what () const throw ()

  {

return "C++ Exception";

  }

};

int main()

{

try

  {

  throw MyException();

  }

catch(MyException& e)

{

std::cout << "MyException caught" <<

std::endl; std::cout << e.what() << std::endl;

}

catch(std::exception& e)

  {

//其他的错误

  }

}

 

这将产生以下结果:

MyException caught
C++ Exception

在这里,what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因。

 

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

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

相关文章

运动新风尚,听歌不用线——南卡OE真无线骨传导耳机

以往在选择运动耳机时&#xff0c;通常会选择骨传导耳机&#xff0c;骨传导耳机有着传统入耳式耳机以及头戴式耳机所不具备的优势。例如在运动稳定性以及安全性方面&#xff0c;骨传导耳机则更胜一筹&#xff0c;它在使用时&#xff0c;双耳是开放的&#xff0c;首先它不会有传…

0. 深度生成模型-基于得分的生成模型

深度生成模型-基于得分的生成模型 1. 概述1.1. 深度生成模型1.2. 本文内容 2. 基于得分的生成模型2.1. 分数匹配2.1.1. 去噪分数匹配2.1.2. 切片分数匹配 2.2. 朗之万动力学采样 3. 基于分数的生成式建模所面临的挑战3.1. 流形假说3.2. 低数据密度区域3.2.1 与分数匹配的分数估…

redis运维

redis运维 1.主从复制 互联网三高架构&#xff1a;高并发、高性能、高可用 单机redis的风险与问题&#xff1f; 问题1.机器故障 现象&#xff1a;硬盘故障、系统崩溃本质&#xff1a;数据丢失&#xff0c;很可能对业务造成灾难性打击结论&#xff1a;基本上会放弃使用redis.…

前端人必须掌握的抓包技能

1. 前言 时隔 3 年&#xff0c;重新接触了移动端 h5 页面开发&#xff0c;上一次还是大四实习。这一次是 hybrid 开发&#xff0c;涉及到 h5 页面与原生 app 的交互&#xff0c;h5 页面需要与原生打通登录态&#xff0c;以及调用原生app 的接口&#xff0c;比如调用原生相机进…

牙科口腔小程序开发 用科技呵护口腔健康

随着人们生活经济水平的提高&#xff0c;对于健康也更加重视&#xff0c;牙科口腔是重要的一个方面&#xff0c;尤其是青少年因为饮食习惯的问题尝尝需要看牙科&#xff0c;口腔科等&#xff0c;传统的牙科口腔医院服务流程繁琐&#xff0c;给用户造成了极大困扰。随着互联网技…

企业实施BI的时机和选择考虑

如果你的企业还只处在初创阶段&#xff0c;但又需要为日后的BI数据化做准备时。在数聚股份看来出于成本考虑&#xff0c;你可以先用Excel梳理好业务核心数据&#xff0c;聚焦核心指标&#xff0c;接着发展用户&#xff0c;积累业务数据。 当你的Excel报表已经无法承载你的业务量…

kafka3.x 入门 安装(一)

一、下载地址 http://kafka.apache.org/downloads.html 二、 zookeeper安装教程 https://blog.csdn.net/weixin_43205308/article/details/130426019 三、解压 这里使用的是kafka_2.12-3.0.0.tgz tar -zvxf kafka_2.12-3.0.0.tgz四、修改配置 进入到安装路径的config文件夹下…

青岛大学_王卓老师【数据结构与算法】Week03_05_线性表的链式表示和实现5_学习笔记

本文是个人笔记&#xff0c;仅用于学习分享&#xff0c;素材来自青岛大学王卓老师的教学视频&#xff0c;如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–第3周05–2.5线性表的链式表示和实现5–单链表基本操作3–清空单链表 &#…

Linux基于thundersvm使用GPU对svm进行加速

Linux基于thundersvm使用GPU对svm进行加速 文章目录 Linux基于thundersvm使用GPU对svm进行加速下载方法pip快速下载命令 普通下载命令问题解决方法以下操作需要使用sudo权限 使用thundersvm调用方式 在代码中的使用训练代码更改更改内容 加载模型同样需要导入thundersvm更改内容…

GC日志中的信息怎么看-1

GC日志中的信息怎么看 GC日志中括号里面是GC信息&#xff0c;包括GC前、后堆内存使用量和堆内存总大小 以一份GC日志为例&#xff1a; [GC (Allocation Failure) PSYoungGen: 1362K->297K(2048K)]&#xff0c;表示在执行Young GC时&#xff0c;Young区占用了1362k的空间&a…

swagger3+nginx访问swagger-config报404问题解决

springboot2.7.11springdoc-openapi-ui1.6.14实现sagger3的接入&#xff0c;在使用nginx转发时遇到Failed to load remote configuration异常&#xff0c;查看请求发现在加载swagger-config时报404: 多番搜寻后找到这个地址&#xff1a;https://springdoc.org/faq.html#how-can…

希望脱颖而出的企业的23个社交媒体帖子创意

社交媒体已成为现代商业不可或缺的一部分。它为企业提供了前所未有的机会与客户建立联系并建立忠实的追随者。然而&#xff0c;由于社交媒体上有如此多的竞争声音&#xff0c;要脱颖而出比过去任何时候都更加困难。 在本文中&#xff0c;我们将分享23个社交媒体发帖创意&#…

使用ClimateLearn

来源 ClimateLearn官网使用介绍 ClimateLearn 是一个 Python 库&#xff0c;用于以标准化、直接的方式访问最先进的气候数据和机器学习模型。 背景 近年来&#xff0c;极端天气事件使气候变化的威胁更加明显。 袭击美国东部的大西洋飓风的强度和严重程度一直在增加。 倾盆大雨…

飞凌嵌入式荣获「ISO14001」和「ISO45001」双认证

近日&#xff0c;飞凌嵌入式荣获 ISO14001环境管理体系认证 和 ISO45001职业健康安全管理体系认证 两项证书&#xff0c;标志着飞凌嵌入式在规范化、标准化和科学化的现代企业管理轨道上更进一步。 荣获ISO14001环境管理体系认证证书无疑是对飞凌嵌入式现有管理体系、产品质量与…

kubernetes集群备份与恢复

目录 一、k8s集群备份与恢复 二、k8s备份-备份etcd 2.1 etcd v2版本数据备份与恢复 2.2 etcd v3版本数据备份与恢复 2.3 etcd数据备份脚本 1.1.4 k8s集群etcd备份恢复流程 三、k8s备份-velero 3.1 velero简介 3.2 velero部署 1.安装 2.准备镜像 3.准备对象存储 4.准…

JAVA-编程基础-01初始Java

Lison <dreamlison163.com>, v1.0.0, 2023.03.05 JAVA-编程基础-01-初始Java 文章目录 JAVA-编程基础-01-初始JavaJava语言概述Java是什么Java语言的特 初始Java的main方法Main 方法示例了解HelloWorld代码的编写 运行Java程序**JDK、JRE、JVM之间的关系&#xff1f;** …

人工成本上涨推动服务行业转向智能化

近年来&#xff0c;随着人工成本的不断上涨&#xff0c;越来越多的企业开始转向智能客服系统&#xff0c;以提供更高效、更经济的客户服务。智能客服的崛起成为了服务行业的新趋势&#xff0c;为企业节省成本、提升服务质量带来了巨大的机遇。 ** 智能接口测试地址&#xff1a;…

【CentOS】VirtualBox yum 无法使用

【CentOS】VirtualBox yum 无法使用 yum install net-tools -y出现如下错误&#xff1a; cannot find a valid baseurl for repo: base/7/x86_64或无法ping 解决如下&#xff1a; 进入系统&#xff0c;修改网卡信息。 执行修改命令&#xff0c;ifcfg-xxx 后面的xxx就是上面…

Linux系统下查看动态库依赖关系指令(ldd)

下面介绍一下在Linux系统下利用ldd指令查看动态库依赖关系&#xff1b; 文章目录 1、ldd命令全称2 ldd参数说明3 简单示例4 查看缺少的依赖库5、ldd指令详细介绍 LDD用来打印或者查看程序运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题。ldd不是一个可…

iPad平板用的触控笔什么牌子好?主动式电容笔推荐

现在&#xff0c;电容笔已经成为在线办公、在线教育等产业中的热门产品&#xff0c;那么&#xff0c;平替电容笔是否会代替苹果原有的电容笔呢&#xff1f;实际上&#xff0c;你根本不需要花那么多钱去买一个原装的苹果电容笔。一支普通的平替式电容笔只需要一两百元&#xff0…