C++ 的异常处理详解

C++ 的异常处理详解

在编程过程中,错误和异常是不可避免的,合理的异常处理机制能够提高程序的健壮性。在 C++ 中,异常机制为捕获和处理错误提供了一种结构化的方式。本文将对 C++ 的异常处理进行详细探讨,包括异常的概念、如何抛出和捕获异常、标准异常、自定义异常类以及在使用异常时需要注意的问题。

1. 什么是异常?

异常是指程序在执行过程中出现的意外情况。当代码发生错误时,程序会停止执行并返回特定的数据。C 语言中只能通过返回值来处理错误,而 C++ 则允许程序员通过异常机制更方便地管理错误。

在 C++ 中,您可以接收自己返回的值或系统返回的值,根据返回数据的类型不同,执行相应的错误处理逻辑。

2. 如何抛出异常?

在 C++ 中,可以使用 throw 关键字抛出异常。例如:

throw 数据;

这里的 “数据” 可以是任何类型的对象或值,但注意不要抛出局部变量的地址或引用。

3. 如何捕获异常?

使用 trycatch 块来捕获异常。具体的代码结构如下:

try {// 可能会产生异常的代码或函数调用
} catch (类型名& 变量名) {// 处理错误
}
示例中分母为0,显然属于异常
#include<iostream>
#include<stdexcept>
using namespace std;class DivideByZeroException : public runtime_error 
{
public:DivideByZeroException() : runtime_error("除数为0") {}
};
int main()
{int a, b, c;cout << "Enter three numbers: ";cin >> a >> b ;try{if(b == 0){throw DivideByZeroException();}else{c = a / b;cout << "The result is: " << c << endl;}   }catch (const DivideByZeroException& e){cout << e.what() << endl;}cout<<"程序结束"<<endl;return 0;}

try 块内的代码如果发生异常,将执行相应的 catch 块来处理这些异常。
在这里插入图片描述

4. 异常说明

C++ 函数可以使用异常说明,定义该函数可能抛出的异常类型。格式如下:

返回值 函数名(参数列表) throw(类型1,类型2,...) {// 函数实现
}

异常说明相当于对函数使用者的承诺:函数只能抛出说明过的异常类型。如果抛出了未在说明中列出的异常类型,程序将产生运行时错误。

5. 标准异常

C++ 定义了一些标准异常类。在发生对应异常时,会自动抛出这些定义好的异常类对象。主要的标准异常包括:

  • exception:所有标准 C++ 异常的基类,可以捕获所有标准异常。
  • bad_alloc:通过 new 抛出,表示内存不足。C++11 中会抛出其子类 bad_array_new_length
  • bad_cast:通过 dynamic_cast 抛出。
  • bad_exception:处理无法预期的异常。
  • bad_typeid:通过 typeid 抛出。
  • logic_error:理论上可以通过读取代码来检测到的异常。

6. 自定义异常类

除了标准异常外,开发者还可以自定义异常类,以满足特定需求。以下是一个自定义异常类的示例:

#include <string>class ZZError {std::string time;std::string file;std::string func;size_t line;std::string erro;
public:ZZError(const std::string& time, const std::string& file, const std::string& func, const size_t& line, const std::string& erro): time(time), file(file), func(func), line(line), erro(erro) {}
};

自定义异常类可以包含更多上下文信息,便于错误追踪和调试。

7. 使用异常需要注意的问题

在使用异常处理机制时,需要注意以下事项:

  1. 不要返回局部变量、对象的地址,但可以返回临时对象。
  2. 建议使用引用捕获异常,以避免对象的构造和拷贝造成开销。
  3. 不要在构造函数和析构函数中抛出异常。如果构造函数抛出异常,对象将无法被构造;如果析构函数抛出异常,可能会导致程序崩溃。
  4. 在捕获父子类异常时,先捕获子类类型,再捕获父类类型。这样可以确保子类异常被正确处理。

注意:trycatch 块之间不能有任何语句。

总结

C++ 的异常处理机制为程序员提供了强大的工具来捕获和处理错误,增强了代码的健壮性和可维护性。通过合理利用标准异常和自定义异常类,我们可以更有效地进行错误管理,提高代码的健壮性和可读性。

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

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

相关文章

IP协议知识点总结

IP协议主要分为三个 1. 地址管理 每个网络上的设备, 要能分配一个唯一的地址 2. 路由选择 小A 给小B 发消息, 具体应该走什么路线 3. 地址管理 IP 地址. 本质上是一个 32 位的整数 通常将, 32 位的整数使用点分十进制来表示, 如 192.168.1.1 一共可以表示 42 亿 9 千万个地址…

秒杀优化(异步秒杀,基于redis-stream实现消息队列)

目录 秒杀优化一&#xff1a;异步秒杀1&#xff1a;思路2&#xff1a;实现 二&#xff1a;redis实现消息队列1&#xff1a;什么是消息队列2&#xff1a;基于list结构实现消息队列3&#xff1a;基于pubsub实现消息队列4&#xff1a;基于stream实现消息队列5&#xff1a;stream的…

小新学习k8s第六天之pod详解

一、资源限制 Pod是k8s中的最小的资源管理组件&#xff0c;pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。k8s中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和Deployment等…

Solana 代币 2022 — Transfer Hook

从零到英雄的 Solana 代币 2022 — Transfer Hook Token 2022 计划引入了几项令人兴奋的扩展&#xff0c;增强了铸造和代币账户的功能。在这些功能中&#xff0c;我个人最喜欢的是Transfer Hook &#xff08;转账钩子&#xff09; 。 想象时间 让我们戴上想象的帽子&#xf…

自定义类型:结构体(一)

一 . 结构体的相关概念 结构体&#xff0c;无需多言&#xff0c;是我们的老朋友了&#xff0c;我们之前就学习过一些有关结构体的知识&#xff0c;今天我们就来正式认识一下这个朋友 结构体属于一种自定义类型&#xff0c;在我们C语言中&#xff1a;自定义类型并非只有结构体…

使用匿名管道时出现程序一直运行问题

父进程创建两个子进程&#xff0c;父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息&#xff0c;体现通信效果。(源程序pipe_1.c) 一开始&#xff0c;我忘了初始化pipe,很傻*的直接把fd当管道使&#xff0c;出现了儿子喊爸爸"i am your father."的…

协程4 --- 一个特殊的栈溢出例子

文章目录 代码运行结果分析 代码 先看下面这个程序流程&#xff1a; 有个长度位24的字符数组buffer&#xff0c;前面16个字符初始化。 把attack函数的地址复制到后面8个字符&#xff08;编译成64位程序&#xff0c;指针大小为8Byte&#xff09;。 打印信息&#xff1a;do Some…

C++用string实现字符串相加

. - 力扣&#xff08;LeetCode&#xff09; -》》》》》题目链接 实现思路&#xff1a;计算数字符串长度并用数组的方式计算出字符位置&#xff0c;用字符的ask码‘0’计算出字符本身。 class Solution { public:string addStrings(string num1, string num2) {string str;int…

03 Oracle进程秘籍:深度解析Oracle后台进程体系

文章目录 Oracle进程秘籍&#xff1a;深度解析Oracle后台进程体系一、Oracle后台进程概览1.1 DBWn&#xff08;Database Writer Process&#xff09;1.2 LGWR&#xff08;Log Writer Process&#xff09;1.3 SMON&#xff08;System Monitor Process&#xff09;1.4 PMON&#…

【大数据学习 | kafka高级部分】文件清除原理

2. 两种文件清除策略 kafka数据并不是为了做大量存储使用的&#xff0c;主要的功能是在流式计算中进行数据的流转&#xff0c;所以kafka中的数据并不做长期存储&#xff0c;默认存储时间为7天 那么问题来了&#xff0c;kafka中的数据是如何进行删除的呢&#xff1f; 在Kafka…

浏览器存储策略解析(三)Local/sessionStorage实战:如何查看本地浏览器上数据

物理意义上的localStorage/sessionStorage在哪里 我们都知道&#xff0c;localStorage存于本地&#xff0c;sessionStorage存于会话&#xff0c;这是见名知意可以得到的。但是在物理层面他们究竟存储在哪里呢&#xff1f; localStorage和sessionStorage一样&#xff0c;是存储…

设计模式讲解02—责任链模式(Chain)

1. 概述 定义&#xff1a;责任链模式是一种行为型模式&#xff0c;在这个模式中&#xff0c;通常创建了一个接收者对象的链来处理请求&#xff0c;该请求沿着链的顺序传递。直到有对象处理该请求为止&#xff0c;从而达到解耦请求发送者和请求处理者的目的。 解释&#xff1a;责…

判断二叉搜索树(递归)

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。binary search tree (BST) 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 …

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…

大语言模型(LLM)量化基础知识(一)

请大家关注我的知乎博客&#xff1a;- 派神 - - 知乎 随着大型语言模型 (LLM) 的参数数量的增长,与其支持硬件&#xff08;加速器内存&#xff09;增长速度之间的差距越来越大&#xff0c;如下图所示&#xff1a; 上图显示&#xff0c;从 2017 年到 2022 年&#xff0c;语言模…

【comfyui教程】ComfyUI 现已支持 Stable Diffusion 3.5 Medium!人人都能轻松上手的图像生成利器

前言 ComfyUI 现已支持 Stable Diffusion 3.5 Medium&#xff01;人人都能轻松上手的图像生成利器 大家翘首以盼的Stable Diffusion 3.5 Medium模型终于来了&#xff01;就在今天&#xff0c;Stability AI 正式推出了这款“亲民版”平衡模型&#xff0c;让创作者们得以在消费…

大模型微调技术 --> LoRA 系列之 AdaLoRA

AdaLoRA 1.摘要 之前的微调方法(如低秩更新)通常将增量更新的预算均匀地分布在所有预训练的权重矩阵上&#xff0c;并且忽略了不同权重参数的不同重要性。结果&#xff0c;微调结果不是最优的。 为了弥补这一差距&#xff0c;我们提出了AdaLoRA&#xff0c;它根据权重矩阵的…

带你搞懂红黑树的插入和删除

文章目录 1. 红黑树1.1 红黑树的概念1.2 红黑树的性质1.3 红黑树节点的定义1.4 红黑树的插入找到插入的位置调节平衡 1.5 红黑树的删除删除节点平衡调整 1.6 红黑树和AVL树的比较 1. 红黑树 1.1 红黑树的概念 红黑树也是一种二叉搜索树,但是在每一个节点上增加了一个存储位表…

揭秘全向轮运动学:机动艺术与上下位机通信的智慧桥梁

✨✨ Rqtz 个人主页 : 点击✨✨ &#x1f308;Qt系列专栏:点击 &#x1f388;Qt智能车上位机专栏: 点击&#x1f388; 本篇文章介绍的是有关于全向轮运动学分析&#xff0c;单片机与上位机通信C代码以及ROS里程计解算的内容。 目录 大纲 ROS&#xff08;机器人操作系统&…

移远通信推出八款天线新品,覆盖5G、4G、Wi-Fi和LoRa领域

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;再次推出八款高性能天线新品&#xff0c;进一步丰富其天线产品阵容&#xff0c;更好地满足全球客户对高品质天线的更多需求。具体包括5G超宽带天线YECT005W1A和YECT004W1A、5G天线YECT028W1A、4G天…