c++try-catch块的使用和异常处理机制。异常的传播和捕获规则。

c++try-catch块的使用和异常处理机制。
在C++中,try-catch块是一种异常处理机制,用于在程序执行期间捕获和处理可能发生的异常。try块用于包含可能抛出异常的代码,而catch块则用于捕获并处理这些异常。

以下是try-catch块的基本用法和异常处理机制的简要说明:

基本语法

try {  // 尝试执行的代码,可能抛出异常  
}  
catch (异常类型1 e) {  // 处理异常类型1的代码  
}  
catch (异常类型2 e) {  // 处理异常类型2的代码  
}  
// ... 可以添加多个catch块来处理不同类型的异常

使用示例

#include <iostream>  
#include <stdexcept> // 包含标准异常类  int main() {  try {  int x = 5;  if (x == 0) {  throw std::runtime_error("除数不能为零!"); // 抛出异常  }  int y = 10 / x;  std::cout << "结果是: " << y << std::endl;  }  catch (const std::runtime_error& e) {  // 捕获并处理std::runtime_error异常  std::cerr << "捕获到异常: " << e.what() << std::endl;  }  catch (...) {  // 捕获所有其他类型的异常  std::cerr << "捕获到未知类型的异常" << std::endl;  }  return 0;  
}

异常处理机制
抛出异常:使用throw关键字抛出异常。可以抛出任何C++数据类型的值,包括基本数据类型、指针、对象等。通常,我们会抛出标准异常类(如std::runtime_error、std::logic_error等)或其派生类的实例。
捕获异常:使用catch块来捕获异常。每个catch块指定它可以处理的异常类型。当try块中的代码抛出异常时,程序会查找与之匹配的catch块。如果找到了匹配的catch块,程序会跳转到该块并执行相应的异常处理代码。
异常传播:如果在try块中抛出了异常,并且没有找到匹配的catch块来捕获该异常,那么异常会继续传播到调用栈的上层,直到找到匹配的catch块或到达程序的顶层(main函数的外部),此时程序会终止并显示未捕获的异常信息。
多个catch块:可以在try块后面添加多个catch块来处理不同类型的异常。这样,程序可以根据异常的类型执行不同的处理逻辑。
捕获所有类型的异常:使用省略号(…)作为catch块的参数类型,可以捕获所有其他未被前面的catch块捕获的异常。这通常用于处理未知类型的异常。
通过合理地使用try-catch块和异常处理机制,可以提高程序的健壮性和可维护性,使程序能够更好地应对潜在的错误和异常情况。

异常的传播和捕获规则。

在C++中,异常的传播和捕获遵循一系列规则,这些规则定义了异常如何在代码中传播以及如何被捕获和处理。以下是C++异常传播和捕获的主要规则:

异常传播:
当在try块内部发生异常时,程序会立即退出当前的try块,并开始搜索匹配的catch块来处理该异常。
如果在try块中没有找到匹配的catch块,异常会传播到调用栈的上一层,即调用该try块的函数或方法中。
这个过程会继续进行,直到找到匹配的catch块或者异常传播到程序的顶层(通常是main函数外部),此时程序会调用std::terminate并终止执行。
捕获规则:
catch块按照它们出现的顺序进行匹配。编译器会从第一个catch块开始检查,如果异常类型与catch块参数列表中指定的类型匹配,则执行该catch块的代码。
如果多个catch块可以捕获同一种类型的异常,那么第一个与该类型匹配的catch块将被选中。
如果try块抛出的异常类型与任何catch块都不匹配,并且没有catch(…)块来捕获所有其他类型的异常,那么异常会继续传播。
异常类型匹配:
异常类型匹配遵循C++的类型匹配规则。如果抛出的异常对象与catch块参数列表中指定的类型完全匹配,或者可以隐式转换为该类型,则匹配成功。
基类指针或引用可以捕获派生类对象,这被称为异常捕获的继承性。
重新抛出异常:
在catch块内部,可以使用throw;语句重新抛出当前捕获的异常。这允许异常继续传播到调用栈的上一层,可能在那里找到另一个catch块来处理它。
重新抛出的异常保持其原始类型,这意味着它可以在上层调用栈中找到正确类型的catch块。
异常规格(Exception Specifications):
函数的异常规格(在函数声明中使用throw()指定)可以限制该函数可能抛出的异常类型。然而,从C++11开始,异常规格被废弃,并在C++17中被移除,因为它们通常被认为是不必要的,并且可能导致一些不直观的行为。
异常安全:
在编写可能抛出异常的代码时,应该考虑异常安全性,即确保在异常发生时,程序状态保持在一个有效且一致的状态。这通常涉及使用资源获取即初始化(RAII)原则来管理资源,以确保在异常发生时,资源能够被正确释放。
通过遵循这些规则,你可以编写出健壮且可维护的C++代码,能够妥善处理可能出现的异常情况。

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

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

相关文章

Python自动化部署与配置管理:Ansible与Docker

Ansible 和 Docker 是两种常用于自动化部署和配置管理的工具。Ansible 是一个基于 Python 的自动化运维工具&#xff0c;可以配置管理、应用部署、任务自动化等。而 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&…

算法项目(2)—— LSTM、RNN、GRU(SE注意力)、卡尔曼轨迹预测

本文包含什么? 项目运行的方式(包教会)项目代码LSTM、RNN、GRU(SE注意力)、卡尔曼四种算法进行轨迹预测.各种效果图运行有问题? csdn上后台随时售后.项目说明 本文实现了三种深度学习算法加传统算法卡尔曼滤波进行轨迹预测, 预测效果图 首先看下不同模型的指标: 模型RM…

unity学习(33)——角色选取界面(原版)

10ARPG网络游戏编程实践&#xff08;十&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;一&#xff09;&#xff08;流畅&#xff09;_哔哩哔哩_bilibili 角色选择界面教程中是这样的&#xff01;&#xff08;这个美工肯定是不能拿出去卖的&#xff0c;但是是有…

IP协议及相关技术协议

一、IP基本认识 1. IP的作用 IP在TCP/IP模型中处于网络层&#xff0c;网络层的主要作用是实现主机与主机之间的通信&#xff0c;而IP的作用是在复杂的网络环境中将数据包发送给最终目的主机。 2. IP与MAC的关系 简单而言&#xff0c;MAC的作用是实现“直连”的两个设备之通信…

77、Spring、Spring Boot和Spring Cloud的关系

77、Spring、Spring Boot和Spring Cloud的关系 随着 Spring、Spring Boot 和 Spring Cloud 的不断发展&#xff0c;越来越多的开发者加入 Spring 的大军中。对于初学者而言&#xff0c;可能不太了解 Spring、Spring Boot 和 Spring Cloud 这些概念以及它们之间的关系&#xff…

[IO复用] Windows IOCP的初步学习

文章目录 前言正文重叠 IO如何理解重叠IO&#xff1a;创建重叠IO重叠IO操作的返回值如何确认IO操作的结果 IOCP比重叠IO多了什么IOCP的流程IOCP和EPOLL的比较 参考 前言 提起IO复用&#xff0c;大部分人首先接触的都是Select、Poll、Epoll&#xff0c;但是在不同的系统中&…

10个行锁、死锁案例⭐️24张加锁分析图彻底搞懂Innodb行锁加锁规则!

10个行锁、死锁案例⭐️24张加锁分析图&#x1f680;彻底搞懂Innodb行锁加锁规则&#xff01; 上篇文章 我们描述原子性与隔离性的实现&#xff0c;其中描述读操作解决隔离性问题的方案时还遗留了一个问题&#xff1a;写操作是如何解决不同的隔离性问题&#xff1f; 本篇文章…

linux CentOs 安装docker 推荐生产环境使用

目录 1. 在CentOs上安装docker所需的系统环境 2. 卸载旧版本 2.1 查看是否已安装docker 2.2 卸载已安装的docker 3. 安装方式 3.1 使用rpm存储库安装(推荐使用该方法) 3.2 从包中安装 4. 开始docker 1. 在CentOs上安装docker所需的系统环境 需要以下CentOS版本之一的维…

数据结构-邻接链表

介绍 邻接矩阵是运用较多的一种储存图的方法&#xff0c;但如果一张网图边数较少&#xff0c;就会出现二维矩阵中大部分数据为0的情况&#xff0c;浪费储存空间 为了避免空间浪费&#xff0c;也可以采用数组与链表结合的方式来存储图 假设有这样一张图 我们可以先用一个数组…

C#中的Async的异常处理

在C#的代码编写中可以通过try/catch来捕获Exception。然而当调用Async方法时需要特别注意 private void Start() {try{TestVoid();}catch (Exception e){Debug.LogException(e);} }private async void TestVoid() {var t Task.Delay(1);await t;throw new Exception("Te…

测试环境搭建整套大数据系统(四:ubuntu22.4创建普通用户)

一&#xff1a;创建用户&#xff0c;修改密码&#xff0c;增加sudo权限。 useradd dolphinscheduler #输入密码 passwd dolphinscheduler # 配置 sudo 免密 sed -i $adolphinscheduler ALL(ALL) NOPASSWD: NOPASSWD: ALL /etc/sudoers sed -i s/Defaults requirett/#Defa…

实现一个python代码编辑器

代码编辑器采用了monacoEditor&#xff0c;一个现成的编辑器。网上有很多文档介绍和开源项目&#xff0c;但是怎么说呢&#xff0c;跟着做&#xff0c;可以实现一个网页编辑器&#xff0c;可以高亮python的语法&#xff0c;但是没有python的提示&#xff0c;找不到可以参考的&a…

ADO.NET和EF框架性能对比

ADO.NET和Entity Framework&#xff08;EF&#xff09;框架在性能上有一些不同。总体来说&#xff0c;ADO.NET通常比EF具有更高的性能&#xff0c;特别是在执行大量数据访问操作时。下面是一些关于它们性能差异的要点&#xff1a; 数据库操作方式&#xff1a; ADO.NET&#xf…

C++ 八数码问题理解 `IDA*` 算法原则:及时止损,缘尽即散

1.前言 八数码是典型的状态搜索案例。如字符串转换问题、密码锁问题都是状态搜索问题。 状态搜索问题指由一种状态转换到到最终状态&#xff0c;求解中间需要经过多少步转换&#xff0c;或者说最小需要转换多少步&#xff0c;或者说有多少种转换方案。本文和大家聊聊八数码问…

使用哈希函数删除哈希值相同的文件

哈希函数及哈希值的定义 哈希函数是一种将任意长度的输入数据映射为固定长度的输出数据的函数。它通过对输入数据执行一系列复杂的数学运算&#xff0c;将数据转换为固定长度的唯一标识&#xff0c;这个唯一标识就是哈希值。 哈希函数的作用 数据唯一性: 对于不同的输入数据&…

Java面试题:volatile专题

王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》第4篇文章,我们一起来看看面试中会问到哪些关于volatile的问题吧。数据来源: 大部分来自于各机构(Java之父,Java继父,某灵,某泡,某客)以及各博主整理文档…

Java程序中为什么要使用StringBuilder

遇到这个问题是来源于leetcode的一道题&#xff1a;字符串解码。其中的题解涉及字符串的操作使用的是StringBuilder&#xff0c;不是String。 class Solution {public String decodeString(String s) {StringBuilder res new StringBuilder();int multi 0;LinkedList<Int…

MR专题:体验Apple Vision Pro多元生态内容,拥抱MR供应链机遇

今天分享的是MR系列深度研究报告&#xff1a;《MR专题&#xff1a;体验Apple Vision Pro多元生态内容&#xff0c;拥抱MR供应链机遇》。 &#xff08;报告出品方&#xff1a;方正证券&#xff09; 报告共计&#xff1a;15页 来源&#xff1a;人工智能学派 Apple Vision Pro…

基因富集分析——GO/DO

DO&#xff08;Disease Ontology&#xff09;分析涉及多种具体的步骤和方法&#xff0c;下面是一些常见的DO分析步骤或方法&#xff1a; 1. 疾病分类和定义&#xff1a;分析DO中的疾病分类体系&#xff0c;理解不同疾病之间的关系和归类。这包括查看DO本体中的层次结构、疾病之…

本地TCP通讯(C++)

概要 利用TCP技术&#xff0c;实现本地ROS1和ROS2的通讯。 服务端代码 头文件 #include <ros/ros.h> #include "std_msgs/String.h" #include "std_msgs/Bool.h" #include <iostream> #include <cstring> #include <unistd.h>…