c++异常处理exception

// c++中的异常处理
// 1.throw : 专门用于抛出异常,做出提示
// 2.try   : 尝试运行可能会异常的代码
// 3.catch : 用于接收前面跑出来的异常并进行解决// 执行循序为:
// try
// {
//     throw ...; // 执行的代码中必须直接或者间接的有throw
// }
// catch在throw之后执行,catch执行的数据类型入参与throw抛出异常的数据类型一致
// catch(const std::exception& e)
// {
//     std::cerr << e.what() << '\n';
// }// try
// {
//     do th1 ... (必须会执行的代码)
//     直接或间接有throw,
//     如果此处没有触发throw则会执行下文的do th2
//     如果此处有触发throw,则下文的do th2不会继续执行,而是之下下文中的chtch
//     因为如果触发throw,则do th2没有继续执行的必要
//     do th2 ... ()
// }
// // const std::exception& e为接收到的异常情况
// catch(const std::exception& e)
// {
//     // 异常处理
//     std::cerr << e.what() << '\n';
// }// 以上的try catch可以层层嵌套使用
// 在 C++ 中,可以通过嵌套 `try-catch` 来处理更复杂的异常情况,即在一个 `try` 块中嵌套另一个 `try` 块。
// 在嵌套结构中,内部的 `try` 块可以处理外部 `try` 块无法处理的异常。
// 下面是一个嵌套 `try-catch` 的示例代码:
// try {
//     try {
//         // Block of code which may throw an exception
//     } catch (const SomeExceptionType& e) {
//         // Exception handling code for inner try block
//     }
//     // Block of code which may throw another exception
// } catch (const AnotherExceptionType& e) {
//     // Exception handling code for outer try block
// }
// 在上面的代码中,有两个 `try` 块,其中内部的 `try` 块包含一个代码块,可能会引发某种类型的异常。
// 如果在内部的 `try` 块中抛出异常,它将被内部的 `catch` 块捕获和处理。 
// 如果在内部的 `try` 块中未发生异常,则执行内部 `try` 块后的代码块。
// 如果在这个代码块中引发了异常,那么这个异常将被外部的 `catch` 块捕获和处理。
// 需要注意的是,如果一个 `catch` 块捕获了异常,它将防止此异常进一步传播到该代码块之外。
// 因此,如果一个 `catch` 块在处理异常时,抛出了另一个异常,则外部的 `catch` 块将无法捕获最初被抛出的异常,
// 也就是说,只有最内层的 `catch` 块可以捕获到抛出的异常。// 注意:
// 只要有throw抛出了异常,后边就必须有catch就就收异常进行异常处理,这是语法规定。#include <iostream>
#include <string>using namespace std;int test(int a, int b)
{// 当b==0时,正常的处理已经不能继续,必须进行异常处理if (b == 0.0){// 有异常情况->需要通过throw进行报告// 通过throw + 抛出的异常信息;// 抛出的异常信息:支持多种类型throw "这里有问题!";// 第一个throw抛出异常后,后边的throw不会再继续执行,因为已经没有意义// 注意:throw不是return,如果这里有throw,则在后边的代码实现中必须要有catch进行异常处理throw 666;// 如果char数据类型报错信息后没有对应数据类型的catch处理函数,那么将会出现如下报错// terminate called after throwing an instance of 'char'// Aborted (core dumped)throw 'S';// 如果double数据类型报错信息后没有对应数据类型的catch处理函数,那么将会出现如下报错// terminate called after throwing an instance of 'char'// Aborted (core dumped)throw 3.14;}return a / b;
}int main()
{// 异常情况,num没有初始化int num;int val = num;try{cout << test(9, 0) << endl;}// const std::exception& e参数类型为throw抛出异常时对应的参数类型// 参数 `const std::exception& e` 表示捕获任何派生自 `std::exception` 类的异常对象// `std::exception` 是 C++ STL 标准库中所有异常类型的基类,它定义了一些常用的成员函数和属性,// 例如 `what()` 函数,可以用于获取异常对象的描述信息。// 派生自 `std::exception` 的标准异常类包括 `std::runtime_error`、`std::logic_error` 和 `std::bad_alloc` 等。// 使用 `catch(const std::exception& e)` 的语法,表示捕获所有继承自 `std::exception` 的异常类型,// 以确保我们能够捕获可能发生的异常,并提供恰当的异常处理机制。// 需要注意的是,不是所有异常都派生自 `std::exception`,例如内存访问错误、空指针异常等异常就不属于该类型。// 此时,我们需要使用其他适当的异常类来捕获这些异常。// 另外,如果你想自定义异常,可以使用继承自 `std::exception` 的新类,并为它提供自己的行为和描述信息。catch(const std::exception& e){std::cerr << e.what() << '\n';}// 此处catch处理的异常信息为throw抛出异常时的char *类型异常信息catch (const char * str) {cout << str << endl;}// 此处catch处理的异常信息为throw抛出异常时的int类型异常信息catch (int num) {cout << num << endl;}// "..."适配所有数据类型的异常信息// 比如上文中的throw 3.14;并没有对应的catch函数,// 那么如果throw 3.14;抛出将会在此处的catch (...)处理catch (...) {cout << "有问题" << endl;}return 0;
}

c++自定义异常来自于c++标准提供的类:

// c++自定义异常处理类
// 自定义异常处理语法格式:try { throw } catch (const MyExpection& obj) {}
#include <iostream>
#include <exception>using namespace std;// std::exception为c++标准异常处理的共同父类,可以使用该类派生出子类实现自定义异常处理
class MyExpection : public std::exception
{
public:// const char *what const {}// 以上定义方法会报错:// error: looser throw specifier for ‘virtual const char* MyExpection::what() const’// error:   overriding ‘virtual const char* std::exception::what() const noexcept’// what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;// 这个错误是因为虚函数 `what()` 的异常规范(或 throw specifier)与被覆盖的基类中的不同导致的。// 异常规范告诉编译器,在函数抛出的异常类型方面可以期望什么。// 在这里,`const char* MyExpection::what() const` 声明的异常规范应该与 `std::exception::what()` 的规范保持一致。// 在 C++11 中,标准库异常类的 `what()` 声明是 `virtual const char* what() const noexcept`。// `noexcept` 告诉编译器,该函数不会抛出任何异常。// 因此,在自定义异常中,需要将 `what()` 函数的异常规范改为 `noexcept`,以与基类中的异常规范保持一致。// 此外,也可以忽略异常规范,这意味着函数可以抛出任何异常,包括派生自 `std::exception` 的异常类型。// 不过,需要注意的是,忽略异常规范可能会影响代码的可移植性,因为某些编译器可能依赖于异常规范进行一些优化。// 如果你决定忽略异常规范,请确保在实际编译器中测试你的代码。// 修复后的代码如下:const char *what() const noexcept override {return "exception !!!";}
};int main()
{// 可以转到exception类中定义查看具体实现和使用接口MyExpection obj;cout << obj.what() << endl;try {throw MyExpection();} catch(const MyExpection& obj) {std::cerr << obj.what() << '\n';}return 0;
}

 

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

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

相关文章

VRTK4教程 二:基本追踪

文章目录 untiyXR和UnityXRPluginFramwork使用方法&#xff1a; TrackedAlias使用方法使用技巧 untiyXR和UnityXRPluginFramwork 这两个用于跟踪头盔位置&#xff0c;其中UnityXR使用的是旧版API&#xff0c;另一个是新版API&#xff0c;两个我我们选一个即可 使用方法&#…

6.3 Go 结构体(Struct)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【计算机毕设】SpringBoot校园资料分享平台的设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个基于SpringBoot的校园资料分享平台&#xff0c;以满足学生在学习过程中对资料分享和获取的需求。具体目标包括&#xff1a…

Java学习笔记 集合的使用

在实际的项目中开发过程中&#xff0c;会有很多的对象&#xff0c;如何高效、方便的管理这些对象&#xff0c;是影响程序性能与可维护性的重要环节。在Java语言中为这个问题提供了一套完美的解决方案&#xff0c;也就是接下来要介绍的集合框架。 1.1 集合框架的结构 从Collect…

都说美国去工业化了,那美国人都做什么工作啊?

美国&#xff0c;这个全球经济的重要参与者&#xff0c;经历了一场深刻的变革——去工业化。这一过程意味着&#xff0c;曾经以制造业为荣的美国&#xff0c;逐渐将重心转移到了其他领域。那么&#xff0c;美国人都做什么工作呢&#xff1f;让我们走近这位“经济体巨人”&#…

MySql 查询缓存

前言 MySQL的查询缓存&#xff08;Query Cache&#xff09;是一个在内存中存储SELECT语句及其结果集的机制&#xff0c;目的是避免对相同的查询进行重复的解析、编译和执行&#xff0c;从而提高数据库性能。 Mysql 结构图如下&#xff1a; 查询缓存的工作流程大致如下&#…

Java中连接Mongodb进行操作

文章目录 1.引入Java驱动依赖2.快速开始2.1 先在monsh连接建立collection2.2 java中快速开始2.3 Insert a Document2.4 Update a Document2.5 Find a Document2.6 Delete a Document 1.引入Java驱动依赖 注意&#xff1a;启动服务的时候需要加ip绑定 需要引入依赖 <dependen…

【魅力网页的背后】:CSS基础魔法,从零打造视觉盛宴

文章目录 &#x1f680;一、css基础知识⭐1. 认识css &#x1f308;二、选择器初级❤️id与class命名 &#x1f680;一、css基础知识 ⭐1. 认识css 概念 CSS(英文全称&#xff1a;Cascading Style Sheets)&#xff0c;层叠样式表。它是网页的装饰者&#xff0c;用来修饰各标签…

QT 使用信号和槽,让QLabel的内容实时与QLineEdit同步,类似vue框架的双向绑定

在窗口里放置一个单行文本编辑器&#xff08;QLineEdit&#xff09;和一个标签控件&#xff08;QLabel&#xff09;&#xff0c;实现的效果就是当编辑器的内容被编辑时&#xff0c;标 签控件同步显 示编辑控件里的内容 1&#xff09;当 lineEdit 控件被用户编辑时&#xff0c;它…

无人机路径规划:基于鸽群优化算法PIO的无人机三维路径规划MATLAB代码

一、无人机模型介绍 无人机三维航迹规划_无人机航迹规划-CSDN博客 二、部分代码 close all clear clc warning (off) global model global gca1 gca2 gca3 gca4 model CreateModel(); % Create search map and parameters load(BestPosition5.mat); load(ConvergenceCurve5…

四足机器人步态仿真(三)四足机器人基础步态仿真

观前提醒&#xff0c;本章主要内容为分析四足机器人步态实现和姿态控制&#xff0c;碰撞体积等程序 步态效果&#xff1a; 一、完整代码如下 # -*- coding: utf-8 -*-import pybullet as pimport timeimport numpy as npp.connect(p.GUI)p.createCollisionShape(p.GEOM_PLANE…

xLSTM: Extended Long Short-Term Memory

更多内容&#xff0c;请关注微信公众号&#xff1a;NLP分享汇 原文链接&#xff1a;xLSTM: Extended Long Short-Term Memory 论文链接&#xff1a;https://arxiv.org/pdf/2405.04517 为什么要在27年后提出新的LSTM呢&#xff1f; LSTM&#xff08;长短期记忆网络&#xff09…

Java 生成二维码底下带content

直接上代码&#xff1a;效果如下图 需引入 zxing生成二维码包 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>com.…

vue不同页面切换的方式(Vue动态组件)

v-if实现 <!--Calender.vue--> <template><a-calendar v-model:value"value" panelChange"onPanelChange" /></template> <script setup> import { ref } from vue; const value ref(); const onPanelChange (value, mod…

【Matplotlib作图-3.Ranking】50 Matplotlib Visualizations, Python实现,源码可复现

目录 03 Ranking 3.0 Prerequisite 3.1 有序条形图(Ordered Bar Chart) 3.2 棒棒糖图(Lollipop Chart) 3.3 点图(Dot Plot) 3.4 斜率图(Slope Chart) 3.5 杠铃图(Dumbbell Plot) References 03 Ranking 3.0 Prerequisite Setup.py # !pip install brewer2mpl import n…

FJSP:波搜索算法(WSA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

详细介绍 FJSP&#xff1a;波搜索算法(Wave Search Algorithm, WSA)求解柔性作业车间调度问题&#xff08;FJSP&#xff09;&#xff0c;提供MATLAB代码-CSDN博客 完整MATLAB代码 FJSP&#xff1a;波搜索算法(WSA)求解柔性作业车间调度问题&#xff08;FJSP&#xff09;&…

coredns 被误删了,可以通过重新应用 coredns 的 Deployment 或 DaemonSet 配置文件来恢复

如果 coredns 被误删了&#xff0c;可以通过重新应用 coredns 的 Deployment 或 DaemonSet 配置文件来恢复。以下是恢复 coredns 的步骤&#xff1a; 1. 下载 coredns 配置文件 你可以从 Kubernetes 的官方 GitHub 仓库下载 coredns 的配置文件。以下是下载并应用配置文件的步…

快速排序(排序中篇)

1.快速排序的概念及实现 2.快速排序的时间复杂度 3.优化快速排序 4.关于快速排序的细节 5.总代码 1.快速排序的概念及实现 1.1快速排序的概念 快速排序的单趟是选一个基准值&#xff0c;然后遍历数组的内容把比基准值大的放右边&#xff0c;比基准值小的放在左边&#xf…

一本企业画册怎么制作成二维码分享

​在这个数字化时代&#xff0c;二维码已经成为一种便捷的分享方式。企业画册&#xff0c;作为展示企业形象、宣传产品和服务的重要工具&#xff0c;也可以通过二维码进行分享。现在我来教你如何将一本企业画册制作成二维码分享。 1. 准备好制作工具&#xff1a;FLBOOK在线制作…

Springboot校园食堂智能排餐系统-计算机毕业设计源码85935

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对校园食堂智能排餐系统等问题&#xff0c;对…