C++11 新特性 ---- noexcept
1. 异常
异常通常用于处理逻辑上可能发生的错误
在C++98中,提供了一套完善的异常处理机制,直接在程序中将各种类型的异常抛出,从而强制终止程序的运行。
1.1 基本语法

当函数抛出异常时,程序会停止执行,并显示异常信息。异常处理程序可以通过catch语句捕获并处理异常。如果程序没有捕获异常,程序将终止。
在C++中,栈的解旋是在try块中的函数调用完毕后自动完成的。这意味着在try块中的函数调用可能会抛出异常,但不会影响栈的解旋。在catch块中处理异常时,栈的解旋会被暂停,直到catch块处理完毕后,栈的解旋才会恢复。
#include <iostream>
using namespace std;
void func() {int x = 10;int* p = &x;*p = 20;throw *p;
}void catch_func(int a) {std::cout << "Caught exception: " << a << std::endl;
}int main() {try {func();} catch (int e) {catch_func(e);}return 0;
}
heheda@heheda:~/Linux/c++11$ g++ 8.noexcept.cpp -o app
heheda@heheda:~/Linux/c++11$ ./app
Caught exception: 20
【总结】noexcept | 爱编程的大丙 (subingwen.cn)
异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋。----来自爱编程的大丙
1.2 异常接口声明
🦝① 显示指定可以抛出的异常类型
divide 函数后添加了 throw 异常接口声明,其参数可以表示抛出的异常类型,分别为 int 和 MyException 类型
#include <iostream>
using namespace std;struct MyException {MyException(string str):msg(str) {}string msg;
};double divide(int a, int b) throw(MyException,int) {if(b == 0) {throw MyException("divide by zero");}return a / b;
}int main() {try{double val = divide(10, 0);cout <<"value: "<< val << endl;}catch(int e) {cout << "catch except: " << e << endl;}catch(MyException e) {cout << "catch except: " << e.msg << endl;}return 0;
}
运行结果:
catch except: divide by zero
🦝② 不抛出任何异常
#include <iostream>
using namespace std;struct MyException {MyException(string str):msg(str) {}string msg;
};double divide(int a, int b) throw() {if(b == 0) {throw MyException("divide by zero");}return a / b;
}int main() {try{double val = divide(10, 0);cout <<"value: "<< val << endl;}catch(int e) {cout << "catch except: " << e << endl;}catch(MyException e) {cout << "catch except: " << e.msg << endl;}return 0;
}
在divide 函数后添加了throw异常接口声明,其参数列表为空,表示该函数不允许抛出异常
2. noexcept
double divisionMethod(int a, int b) noexcept(常量表达式);
🦝① 简单地在函数声明后加上 noexcept 关键字
🦝② 可以接受一个常量表达式作为参数,常量表达式的结果会被转换成一个bool类型的值:
- 值为 true,表示函数不会抛出异常
- 值为 false,表示有可能抛出异常这里
- 不带常量表达式的noexcept相当于声明了noexcept(true),即不会抛出异常
noexcept | 爱编程的大丙 (subingwen.cn)
----来自爱编程的大丙
在C++11中弃用了例如上文的动态异常声明 throw(MyException, int)这一特性,表示函数不会抛出异常的动态异常声明 throw() 也被新的 noexcept 异常声明所取代
noexcept是C++11中引入的一个关键字,用于指定函数抛出异常的情况。当函数声明中使用noexcept时,编译器可以推断函数不会抛出异常,从而提高代码的执行效率。
🦥noexcept 与 throw动态异常声明的区别:
🦝① 基于异常机制的throw()会带来一些额外的开销,若出现函数抛出异常,会导致函数栈被依次地展开(栈解旋),并自动调用析构函数栈上的所有函数
🦝② noexcept 修饰的函数如果抛出了异常,编译器可以选择直接调用 std::terminate() 函数来终止程序的运行,这比基于异常机制的 throw() 在效率上会高一些
#include <iostream>
using namespace std;
void func() noexcept {std::cout << "This function does not throw exceptions" << std::endl;
}int main() {try {func();} catch (...) {std::cout << "Exception caught" << std::endl;}return 0;
}
在这个例子中,func函数使用noexcept关键字指定,因此编译器可以推断出函数不会抛出异常,从而提高代码的执行效率。而main函数中的func调用不会抛出异常,因此程序可以正常运行。
#include <iostream>
using namespace std;double divide(int a, int b) noexcept {if(b == 0) {cout << "divide by zero!!!" << endl;return -1;}return a / b;
}int main() {try{double val = divide(10, 0);cout <<"value: "<< val << endl;}catch(int e) {cout << "catch except: " << e << endl;}return 0;
}
heheda@heheda:~/Linux/c++11$ g++ -std=c++11 8.noexcept.cpp -o app
heheda@heheda:~/Linux/c++11$ ./app
divide by zero!!!
value: -1相关文章:
C++11 新特性 ---- noexcept
1. 异常 异常通常用于处理逻辑上可能发生的错误 在C98中,提供了一套完善的异常处理机制,直接在程序中将各种类型的异常抛出,从而强制终止程序的运行。 1.1 基本语法 当函数抛出异常时,程序会停止执行,并显示异常信息…...
《Linux运维总结:Centos7.6之OpenSSH7.4p1升级版本至9.4p1》
Centos通过yum升级OpenSSH 在官方支持更新的CentOS版本,如果出现漏洞,都会通过更新版本来修复漏洞。这时候直接使用yum update就可以升级版本。 yum -y update openssh 但是,CentOS更新需要有一段时间,不能在漏洞刚出来的时候就有…...
七夕节日表白:七大网页风格与其适用人群
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
通达信指标公式16:使用BARSLAST函数写一个指标回测的思路
★★★★★博文原创不易,我的博文不需要打赏,也不需要知识付费,可以白嫖学习小技巧,喜欢的老铁可以多多帮忙点赞,小红牛在此表示感谢,就是对作者的最大支持。愿与诸君共勉,悟道于股市★★★★★…...
Jenkins自动化部署Vue项目
1、新建item,选择 Freestyle project 2、源码管理选择git,输入git仓库地址和授权账号,并指明要部署的分支 3、构建选择 Execute shell,输入vue项目打包命令 命令示例: source /etc/profile node -v npm config set re…...
Android JNI打印logcat日志
在 JNI 中打印日志可以使用 __android_log_print 函数来实现。该函数是 Android NDK 提供的一个用于在本地代码中输出日志消息到 logcat 的方法。 要在 JNI 中打印日志,请按照以下步骤进行操作: 在你的 JNI C/C 代码中包含 <android/log.h> 头文件…...
第28次CCF计算机软件能力认证(测试)
测试300分要是考试的时候也能这么发挥就好 第一题:现值计算 解题思路:直接模拟 n , m input().split() n int(n);m float(m) l list(map(int , input().split())) res 0 for i in range(0 , n 1):res pow(1 m , -i) * l[i] print(res) 第二题…...
九耶丨阁瑞钛伦特-Java高频面试题-请谈谈 ReadWriteLock 和 StampedLock
ReadWriteLock包括两种子锁 (1)ReadWriteLock ReadWriteLock 可以实现多个读锁同时进行,但是读与写和写于写互斥,只能有一个写锁线程在进行。 (2)StampedLock StampedLock是Jdk在1.8提供的一种读写锁&a…...
【Linux操作系统】深入探索Linux系统编程中的信号集操作函数
在Linux系统编程中,信号集操作函数是非常重要的工具,它们允许我们对信号进行管理和控制。本篇博客将详细介绍Linux系统编程中的信号集操作函数,包括信号集的创建、添加和删除信号,以及对信号集进行操作的常用函数。通过深入了解这…...
[C初阶笔记]P2
Git 1、Git是Linus为了帮助管理Linux内核开发 而开发的一个开放源码的分布式版本控制软件。 2、Git和TortoiseGit的作用。 Git中有各种命令行操作,来维护代码,可以将代码推送到代码托管平台。 TortoiseGit是将Git中各自命令行操作转化为图形化操作。 …...
C++并发编程学习01——hello concurrent world
经典用例 #include <iostream> #include <thread>void hello() {std::cout << "hello concurrent world" << std::endl; }int main() {std::thread t(hello);t.join(); }编译 g -g test.cpp -o out -lpthreadgdb调试 (gdb) r Starting pr…...
大数据扫盲(2): 数据分析BI与ETL的紧密关系——ETL是成功BI的先决条件
着业务的发展每个企业都将产生越来越多的数据,然后这些数据本身并不能直接带来洞察力并产生业务价值。为了释放数据的潜力,数据分析BI(商业智能)成为了现代企业不可或缺的一部分。然而,在数据分析的背后,有…...
Java web 中的 jsp
JSP是什么 JSP是动态网页编程技术 JSP的四大作用域 1.page 表示在当前页面有效 2.request 表现在一次请求中有效 3.session 表示在一次会话中有效 4.application 表示在整个应用程序中有效 jsp内置对象是什么 在jsp开发中会频繁使用到一些对象,如果每次我们在jsp页面中需要…...
uniapp 数组操作
字符串转数组 let string "12345,56789" string.split(,) // [12345,56789] 数组转字符串 let array ["123","456"] array.join(",") // "123,456" 数组元素删除 let array [123,456] // 删除起始下标为1࿰…...
数据结构算法--4堆排序
堆排序过程: >建立堆(大根堆) >得到堆顶元素,为最大元素 >去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整使堆重新有序 >堆顶元素为第二大元素 >重复步骤3,直到堆变空 此时是建立堆后的大根堆模型 将…...
C++学习系列之DLL动态库使用
C学习系列之DLL动态库使用 啰嗦动态库的创建动态库的调用函数生成1.需要头文件函数定义(头文件)2.需要函数定义(函数文件)3.动态库中的头文件4.动态库中的主文件5.运行查看是否存在C#的调用的入口点6.C#调用 总结 啰嗦 项目需要&…...
Java实现钉钉企业内部应用机器和自定义机器人发送消息
前言 公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义机器人…...
基于QT4的GPX文件编辑器开发
GPX文件是记录地理点的文件,本质是一种xml文件。GPX文件目前没有很好的编辑器,因此作者决定开发一款无需安装的绿色编辑器。 在QT4开发中,XML可以用DOM来实现,但其逻辑并不是很清晰。使用模型视图反而会更加可读。因此在开发中,使用model-view模式来实现数据读写。 1 需…...
树结构使用实例---实现数组和树结构的转换
文章目录 一、为什么要用树结构?二、使用步骤 1.引入相关json2.树结构的转换总结 一、为什么要用树结构? 本文将讲述一个实例,构造一棵树来实现数组和tree的转换,这在前端树结构中是经常遇到的 后端返回树结构方便管理ÿ…...
论文阅读_条件控制_ControlNet
name_en: Adding Conditional Control to Text-to-Image Diffusion Models name_ch: 向文本到图像的扩散模型添加条件控制 paper_addr: http://arxiv.org/abs/2302.05543 date_read: 2023-08-17 date_publish: 2023-02-10 tags: [‘图形图像’,‘大模型’,‘多模态’] author: …...
保姆级教程:用ISO镜像给Vcenter 6.7 U3e无损升级到7.0(附每一步截图和注意事项)
从vCenter 6.7 U3e到7.0的无损升级实战指南 在虚拟化运维领域,vCenter的版本迭代往往意味着性能提升和功能增强。对于仍在使用6.7版本的管理员而言,升级到7.0不仅能获得更高效的资源管理能力,还能体验更直观的操作界面。本文将详细解析从6.7 …...
Java-Thread-Affinity源码解析:深入理解IAffinity接口的跨平台设计
Java-Thread-Affinity源码解析:深入理解IAffinity接口的跨平台设计 【免费下载链接】Java-Thread-Affinity Bind a java thread to a given core 项目地址: https://gitcode.com/gh_mirrors/ja/Java-Thread-Affinity Java-Thread-Affinity是一个专注于线程亲…...
FPGA在软件无线电系统中的并行处理与动态重配置技术
1. FPGA在软件无线电系统中的核心价值FPGA(现场可编程门阵列)已成为现代软件无线电(SDR)系统的核心处理引擎。与传统DSP处理器相比,FPGA凭借其并行架构和可重构特性,在实时信号处理领域展现出独特优势。在典…...
2026年京东云环境OpenClaw / Hermes Agent 配置 Token Plan部署怎么搞?详细解读
2026年京东云环境OpenClaw / Hermes Agent 配置 Token Plan部署怎么搞?详细解读。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼T…...
Node.js 与前端 JavaScript 的区别:不止运行环境,底层完全不一样
很多开发者误以为 Node.js 和浏览器 JavaScript 只是运行地方不同、语法一样,实际二者虽共用 ECMAScript 语法规范,但在全局对象、API 能力、DOM/BOM、模块系统、事件循环、系统权限、应用场景等方面存在本质差异。本文从技术底层全面对比,帮…...
从.rofl文件到流畅播放:英雄联盟回放文件管理与播放实战指南
1. 英雄联盟回放文件基础知识 .rofl文件是《英雄联盟》游戏回放的专用格式,本质上是一个记录了整局比赛所有操作指令的数据包。每次对局结束后,客户端会生成一个大小约10-20MB的.rofl文件,这个体积相比视频录屏小得多,因为它只存储…...
MediaCreationTool.bat:Windows部署自动化脚本封装架构深度解析
MediaCreationTool.bat:Windows部署自动化脚本封装架构深度解析 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...
6.1B激活,三榜开源第一!蚂蚁·安诊儿医疗大模型发布
刚刚,由浙江省卫生健康信息中心、蚂蚁健康与浙江省安诊儿医学人工智能科技有限公司联合研发,迄今为止规模最大、能力最强的开源医疗语言模型 AntAngelMed 发布并开源。模型基于 Ling-flash-2.0,MoE架构,100B 总参数仅激活 6.1B 即…...
深入解析ISO/IEC 14443-4:非接触通信的“对话规则”与实战应用
1. 非接触通信的"对话规则"从何而来? 想象一下你第一次和外国朋友交流的场景:双方需要确认彼此能说哪种语言、用多大的声音说话、每次说完话要等多久再回应——这就是ISO/IEC 14443-4协议在非接触通信中扮演的角色。作为近场通信(N…...
2025届必备的六大AI科研方案推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 从文本特征着手,才能降低人工智能生成内容被检出的概率。首先,要融入…...
