c++_exception异常,try和catch,noexcept,throw

2023-05-16

catalog

  • noexcept()函数
  • base
    • 自定义异常类
    • noexcept 和 throw

noexcept()函数

bool f = noexcept( func()); 判断, func()函数, 是否有标记noexcept

base

throw 是: 抛出一个 (对象)
你写: throw 123; throw Foo(); 都正确;

void func(){
	111
	throw Foo();
	222
}

一旦throw Foo()执行, 整个函数提前结束 即, 111里所有数据, 栈数据 回溯回收(就和你调用return一个效果)

由于throw一个什么东西都可以, 所以, 你必须使用一个特殊的语法 来接收 这个(任意对象)
即: try{} catch( ?? ){} catch( ??){}语法
一个try, 可以有多个catch, catch(...){} 表示接收任意

void func(){
	T t0;
	if( true){
		throw Foo();
	}
	T t1;
	return;
}

try{
	func();
} 
catch( const Foo & _d){
	cout << "yes, receive the exception";
}
catch( ...){  ' 注意这个特殊的写法: catch(...){} '
	cout << "other exception";
}

上述执行:

  • 输出: "yes, receive the exception";
  • t0的构造和析构; t1不会构造出来

你的抛出异常, 必须是在try(){}代码块内;
这并不意味着: 你的throw代码 要在 try代码里; 比如上面中, throw在func函数里, 而func函数里 并没有try语句
但是, func函数 是在 try语句里的;


抛出的异常, 必须是在try里, 而且, 必须有catch接收住他;
否则, 两者有一不成立, 则导致: assert的发生 (整个程序结束)
即, 异常其实是很危险的操作!!! 你必须用try和catch来处理, 否则, 整个程序就退出了

int main(){
	throw 123;
}
int main(){
	try{
		throw 123;
	}
	catch( string & s){} ' 不匹配 '
}

以上两个代码, 都是错误的 对 抛出异常的 使用;
程序会中途结束: terminate called after throwing an instance of 'xxx


所有stl里 抛出的异常, 这个对象, 他的根父类是std::exception

class exception{
public:
  exception() noexcept{}
  virtual ~exception() noexcept;
  virtual const char* what() const noexcept; ' 这个异常的名称;  ' 
};

示例

try {
    throw exception();  ' 构造一个对象 '
} catch ( exception & _e) {
    cout << _e.what() << endl;
}

会输出: std::exception

自定义异常类

class my_exception : public exception{
public:
    my_exception(){}
    const char * what() const noexcept;
};

const char * my_exception::what() const noexcept{
    return "my_exception";
}

int main(){
    try {
        throw my_exception();
    } catch ( exception & _e) {
        cout << _e.what() << endl;
    }
}

会输出: my_exception

这里用到了: 多态
my_exception这个对象exception &, 这里就是 多态
(多态: )

noexcept 和 throw

void func(){ ...} 这种写法, 等价于: void func() noexcept( false){ ...}; 写noexcept( false), 等价于不写

对于: void func noexcept( true){ ...} (写noexcept( true), 等价于 noexcept)
此时, 你的...里 就不可以有throw这个操作


在函数声明, 使用throw( types...), 可以指定: 这个函数里, 所有的throw的类型

void func() throw( int, double){
	throw "abc";
}

此时, 执行函数, 由于"abc" 不是int, 也不是double, 所以, 程序会调用: unexpected (不期望的) 程序会死掉

但是, 这种写法: void func() throw( a, b, ...){} 在c++11往后, 就deprecated了!!!

因为: 这种写法 是静态写法, 而c++的异常处理, 是rtti动态的

dynamic exception specifications 动态异常机制
catch时, 对异常类型的匹配, 是通过RTTI动态解析的;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++_exception异常,try和catch,noexcept,throw 的相关文章

随机推荐

  • c++中多态调用场景下基类析构函数的virtual声明

    文章目录 一 基类析构函数未加virtual声明的情况1 1 基础示例演示1 2 进阶示例演示 二 基类析构函数添加virtual声明的情况三 总结 一 基类析构函数未加virtual声明的情况 在多态场景中 xff0c 可通过基类的指针指
  • protobuf协议原理及实现,基于c++

    文章目录 一 protobuf协议简介1 1 protobuf协议简介1 2 数据交互xml json protobuf格式比较1 3 关于 ProtoBuf 的一些思考 二 protobuf库安装三 protobuf库使用第一步 xff0
  • OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式 xff0c 8080并口 xff0c IIC xff0c SPI三种驱动方式 xff0c 采用的单片机是STM32F407 文章目录 一 OLED驱动原理介绍二 8080并口驱动方式三 IIC驱动方式四
  • ROS2学习笔记(1)ROS2+docker的配置方法

    ROS2学习笔记 xff08 1 xff09 ros2 43 docker的配置方法 1 前言2 安装docker2 1 docker的发展史2 2 什么是docker2 3 docker的思想2 3 1 集装箱2 3 2 标准化1 运输方
  • ubuntu之更改ubuntu和windows双系统启动顺序

    ubuntu之更改ubuntu和windows双系统启动顺序 背景方法 背景 安装好ubuntu和windows双系统后 xff0c 一般grub引导默认选择第一个为启动项 xff0c 在公司打工还好 xff0c 毕竟要进ubuntu挣钱
  • 【lightDM】组件理解

    前言 LightDM xff08 Light Display Manager xff09 是轻量级 Linux 桌面显示管理器 其目的是成为 X org 的 X Server 的标准显示管理器 LightDM 负责启动 X servers
  • 【机器人学中的状态估计】第一讲

    1 什么是状态估计 xff1f 通过获得传感器的观测值 xff0c 建立观测值到状态量的模型 xff0c 估计出状态量 2 概率密度函数 后验概率 p x y
  • VScode环境下使用git与github远程操作要点记录

    部分内容来源于网络 xff0c 外加了自己的实践 xff0c 记录了一下 文章目录 一 windows上使用git1 官网下载git https git scm com download win 2 创建本地仓库 二 git远程连接gith
  • 【千律】C++基础:TXT文件的创建、写入和读取

    include lt fstream gt include lt iostream gt using namespace std int main 初始化 ifstream iread txt 初始化输入流 ofstream write t
  • Matlab计算福利彩票的中奖概率

    Quez1 计算福彩双色球一等奖的中奖概率 福彩双色球的玩法如下 从编号1 33的红球里任选6个 另外在编号1 16的蓝球里再任选1个 如果选择的红球和蓝球和当期的开奖结果完全一致 顺序可不同 则中一等奖 Analysis 这是一个组合问题
  • 【千律】OpenCV基础:基于梯度的模板匹配

    环境 xff1a Python3 8 和 OpenCV 内容 xff1a 基于梯度的模板匹配 主要关注边缘信息 xff0c 能够较好的识别不同颜色的目标 实现步骤 xff1a 1 给定原图像I和模板T 2 指定差异度 xff08 相似度 x
  • golang使用SM2(SM2withSM3)签名、验签数据

    golang使用SM2签名 验签数据 场景标准密钥签名算法 Start依赖公钥转base64私钥转hex私钥生成公钥生成密钥对Hex私钥转私钥对象base64公钥转公钥对象签名验签 测试 场景 对接招行支付 标准 密钥 私钥 xff1a H
  • 树莓派与pixhawk串口通信

    一 Pixhawk部分 1 读取数据测试 步骤 xff1a 在Firmware src modules中添加一个新的文件夹 xff0c 命名为rw uart在rw uart文件夹中创建CMakeLists txt文件 xff0c 并输入以下
  • 关于pixhawk波特率修改的两种方法

    一 QGC地面站修改 将pixhawk与地面站相连接进入参数设置界面 xff0c 搜索SYS COMPANION参数设置需要的波特率保存设置 二 终端 xff08 Terminal xff09 修改 打开终端 xff0c 进入源码所在Fir
  • gazebo仿真环境搭建

    主要内容 xff1a 安装gazebo配置gazebo运行gazebomavros控制飞机 1安装gazebo 如果已经安装MAVROS可以直接在终端上输入gazebo查看是否已经拥有gazebo xff0c 因为MAVROS中含有gaze
  • Intel Realsense D435i标定详细步骤

    主要介绍Inter D435i深度相机的IMU 相机和IMU与相机外参数标定的过程 其中 IMU使用的是realsense官方文档的教程 相机和外参数使用的是Kalibr的标定方法 本文所介绍过程的所有代码和生成文件资源放在Kalibr工具
  • 在Ubuntu、NVIDIA_TX2下查看CPU/GPU/内存使用率

    一 Ubuntu 1 cpu 内存 1 使用top命令 top 2 更直观的工具htop sudo apt get install htop htop 2 gpu 用nivida smi命令 xff0c nvidia smi 这个命令只能显
  • 基于RT-Thread OS的 迷你时钟项目

    基于RT Thread OS的 迷你时钟项目 近期在自学RT Thread OS 这是一个国内团队开发的实时物联网操作系统 xff0c 具有组件完整丰富 高度可伸缩 简易开发等优点 RTOS官网 参考学习文档 作品演示 基于RT Threa
  • C++_namespace命名空间

    catalog 内嵌enum class namespace命名冲突多个同名namespace的原理开头 变量 函数前命名空间前 规范写法作用域Base定义顺序 内嵌 c 43 43 17后 支持 namespace A B C 写法 en
  • c++_exception异常,try和catch,noexcept,throw

    catalog noexcept 函数base自定义异常类noexcept 和 throw noexcept 函数 bool f 61 noexcept func 判断 func 函数 是否有标记noexcept base throw 是