【C++基础】C++11的noexcept声明符 与 异常传播

目录

  • C++ noexcept:
    • 1、用途
    • 2、用法
      • 1、noexcept声明符的用法:
      • 2、noexcept运算符的用法
  • 异常传播
    • 1、异常传播的定义
    • 2、异常传播中的规则
    • 3、异常传播的代价

C++ noexcept:

1、用途

C++11使用noexcept指明函数是否抛出异常:

若函数不抛异常,则可做编译优化
即便函数抛异常,也不再说明所抛异常类型(简化)

注意,C++03将throw(ExceptionType)放到函数后面,说明函数会抛出什么类型的异常,也被称为“异常规约”
java用 throws关键字做同样的事情

2、用法

1、noexcept声明符的用法:

void foo() noexcept {}		//函数不抛异常void foo() noexcept(true) {} // noexcept(true)等价于noexceptvoid foo() {} // 可能会抛出异常void foo() noexcept(false) {} // noexcept(false)等价于什么也不写,可能会抛出异常

需要注意的地方:
1、noexcept不能用于区分重载函数。
在这里插入图片描述
在这里插入图片描述

2、如果我们声明函数时说了它不抛异常,但是又在noexcept函数中抛出异常,这就等于调用std::terminate(),终结程序的运行。

void f() { /* 潜在抛出异常 */ }
void g() noexcept {f();      // 合法,即 使 f 抛出 throw 42; // 合法,等效于调用 std::terminate
}

在这里插入图片描述
编译时会报警告:
在这里插入图片描述
主函数调用foo(),运行时程序会终止:
在这里插入图片描述

2、noexcept运算符的用法

bool noexcept( expression )     

noexcept 运算符进行编译时检查,若表达式声明为不抛出任何异常则返回 true。
noexcept (may_throw())返回false,表明可能会抛异常。
noexcept (no_throw())返回true,表明不抛异常。

void may_throw();
void no_throw() noexcept;
int main() {std::cout << std::boolalpha<< "Is may_throw() noexcept? "<< noexcept (may_throw()) << '\n'<< "Is no_throw() noexcept? "<< noexcept (no_throw()) << '\n';
}

异常传播

1、异常传播的定义

嵌套的函数调用,每个函数中都有 try-catch 块,内层函数抛出异常,这时候会出现异常传播
在这里插入图片描述
如图,func3中出现了异常,如果没有被func2中的catch捕获到的话,异常会随着函数的返回,交给函数的上一级(func1)处理,如果func1也处理不了,则交给main函数处理,如果main函数处理不了,程序会崩溃。
需要注意的地方:

  1. try块中抛出异常的语句后面的语句
  2. catch的异常类型与所需匹配的异常实例的类型

2、异常传播中的规则

try-catch的执行规则

  1.  try块中的异常:抛异常的语句后的块代码都被跳过,并开始找exception handler的代码(即找catch代码)
    
  2.  找exception handler的流程:沿函数调用的链反向寻找(1)    按catch块的顺序对比,找到则执行catch块代码(2)    找不到,退出当前函数,将异常传给调用当前函数的函数
    

仍然以上图调用链为例:

Quiz: function3抛出

  1. Exception3,执行哪些statement?
    执行Process ex3 -> statement6-> statement3-> statement4-> statement1-> statement2;
  2. Exception2,执行哪些statement?
    执行Process ex2 ->statement4-> statement1-> statement2;
  3. Exception1,执行哪些statement?
    执行Process ex1 -> statement2;
  4. Exception0,执行哪些statement?
    返回到主函数,程序崩溃

3、异常传播的代价

C++引入的异常处理会为程序带来额外开销和代价。

(1)项目中使用异常,需要考虑与未使用异常的第三方和旧项目代码的整合问题,避免出现一异常安全问题;
(2)异常使用不当,容易造成内存泄漏和程序崩溃,比如函数内抛出异常需要注意栈展开导致的内存泄露,析构函数抛出异常将程序置于不确定状态等;
(3)异常的跳转会彻底扰乱程序的执行流程并难以判断,给代码调试和维护增加难度;
(4)为保证写出异常安全的代码,往往需要借用C++其它特性,如智能指针,这又进一步加剧了代码可读性的恶化与程序的时空开销,包括编译时间的延长,运行效率的较低以及代码尺寸的增大。

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

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

相关文章

使用IndexReader.repen提高搜索速度

1,使用indexreader创建indexsearcher. 2,indexsearcher在使用完了以后不要关闭. 3.使用indexreader.isCurrent()判断索引是否被indexwriter改动. 4,如果索引被改动,indexsearcher.close()先前那个,然后new indexsearcher(indexreader). 传string给searcher,searcher会维护一个内…

CSS中的文本格式

CSS文字格式 (CSS text formatting) CSS text properties allow you to style your text in various ways very easily. Such as color, alignment, spacing, direction, etc. CSS文本属性使您可以轻松地以各种方式设置文本样式。 例如颜色 &#xff0c; 对齐方式 &#xff0c;…

【C++基础】重抛异常与异常的使用场景

重抛异常 异常处理程序可以重新抛出异常。 当它无法处理该异常&#xff0c;或想通知它的调用者发生了一个异常&#xff0c;此时就需要重抛异常&#xff1a; 1、抛出捕获的异常 try {// statements; } catch (TheException &ex) {// Do something;throw; }2、重新抛出另一…

vi @-function

vi 的功能 vi 是一个越用越强大的东西 功能&#xff1a; 例&#xff1a; 1 在插入模式 cwgadfly CTL-V ESC 看到的似&#xff1a; cwgadfly^[ 2 保存到g缓冲区 ESC :退出插入模式 "gdd :"g 指缓冲去个 dd删除一行 这样g缓冲去的内容是 cwgadflayESC 3 test love u 在…

CSS简写指南

1.margin 1.1 margin:1px 2px 3px(上 左右 下) 1.2 margin:2px 3px(上下 左右) 1.2 margin:1px 3px 2px 3px(上右下左) 2.padding(同上) 3.border border:1px red solid (border-width border-color border-style) 1 2 3border-width&#xff1a;1px 2px 3px; //最多可用四个值…

【C++基础】模板基础与函数模板

目录初识模板函数模板函数模板实例化显式实例化隐式实例化初识模板 求两个int、float、char类型的数据的最大值&#xff1a; C里面要这样写&#xff1a; int maxInt(int x, int y); double maxDouble(double x, double y); char maxChar(char x, char y);C使用函数重载&#…

scala 函数中嵌套函数_Scala合成函数

scala 函数中嵌套函数Scala中的合成功能 (Composition function in Scala) Scala composition function is a way in which functions are composed in program i.e. mixing of more than one functions to extract some results. In Scala programming language, there are mu…

js--基础

js 0为false 非0为true null为false 非null为true js 特有with(对象){}:可以确定对象所使用的范围。for(变量 in 对象)对变量和和行为进行遍历html xhtml xml &#xff1a;这些都是标记型文档。DOM:document object model 文档对象模型。 dom三层模型&#xff1a; dom1:将…

字符串的处理[C#]

//string Str1 "友情相逢"; //string Str2 "用一生爱你"; //#region char的使用 //char a a; //Console.WriteLine("IsLetter方法判断a是否为字母&#xff1a;{0}", Char.IsLetter(a)); …

CentOS安全设置

CentOS安全设置 删除多余的用户和用户组&#xff0c;修改口令文件属性&#xff0c;禁止[CtrlAltDelete]重启命令&#xff0c;防止别人ping的方法。整理自互联网。1、删除多余的用户和用户组//删除多余用户# vi /etc/passwduserdel admuserdel lpuserdel syncuserdel shutdownus…

【设计模式之美】<Reading Notes>继承与组合

继承缺点 继承是面向对象的四大特性之一&#xff0c;用来表示类之间的 is-a 关系&#xff0c;可以解决代码复用的问题。虽然继承有诸多作用&#xff0c;但继承层次过深、过复杂&#xff0c;也会影响到代码的可维护性。在这种情况下&#xff0c;我们应该尽量少用&#xff0c;甚至…

scala中何时使用下划线_在Scala中使用下划线

scala中何时使用下划线Underscore (_) character is reserved in Scala and has multiple usages in the programming language. Based on functions that use the underscore have the following usages: 下划线(_)字符在Scala中保留&#xff0c;并且在编程语言中有多种用法。…

如何利用C#编写网页投票器程序 如何使用代理来投票 代理IP来投票

一、前言看个图&#xff0c;了解下投票的过程。提交投票信息投票页 ――――――――&#xff1e;投票信息处理页反馈投票结果(请求页)&#xff1c;―――――――(响应页&#xff09;一般情况下&#xff0c;填写投票信息&#xff0c;然后点提交按钮发送到响应页&#xff0c;这…

【设计模式之美】<Reading Notes>贫血模型与充血模型

小知识 需要了解的一些名词 1、领域驱动设计&#xff08;Domain Driven Design&#xff0c;简称 DDD&#xff09; 2、MVC 三层架构 &#xff1a; M 表示 Model&#xff0c;V 表示 View&#xff0c;C 表示 Controller。 它将整个项目分为三层&#xff1a;展示层、逻辑层、数据层…

TAFE的完整形式是什么?

TAFE&#xff1a;拖拉机和农用设备 (TAFE: Tractors and Farm Equipment) TAFE is an abbreviation of Tractors and Farm Equipment Limited. It is an Indian tractor manufacturer which is founded at Chennai in 1960. It is the second-largest tractor manufacturer in …

Oracle 10g 数据库的备份和还原

一、备份数据库1.在图形工具中&#xff0c;如sqldeveloper,pl/sqldeveloper用以下这句查找空表select alter table ||table_name|| allocate extent; from user_tables where num_rows0;2.把第一步执行得到的结果当用sql语来再次执行3.到oracle服务器上执行备份语句. 运行-cmd …

用户行为分析指导电商精细化运营

规模和利润&#xff0c;这两个在商业运营中最基本的指标&#xff0c;却在电子商务市场中遭遇了不同的待遇。前两年&#xff0c;几乎所有的电商企业都只追求规模&#xff0c;不追求利润&#xff0c;导 致自身的运营极其粗放&#xff0c;绝大多数电商公司只有两招&#xff1a;猛打…

【C++基础】 类模板

类模板 模板是将类中某些类型变为泛型&#xff0c;从而定义一个模板。 如下&#xff1a; 类模板的语法 直接进行对比&#xff1a; 泛型化之前 泛型化之后类模板的实例化 注意&#xff1a;只要是对类模版进行实例化&#xff0c;编译器就会生成一个类&#xff01;&#xff0…

ruby 怎么抛异常_Ruby中的异常处理

ruby 怎么抛异常Ruby异常处理 (Ruby Exception Handling) Exceptions are abnormal conditions arising in the code segment at runtime in the form of objects. There are certain predefined Exception classes whereas we can create our exception known as Custom excep…

cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面

之前两个博客讲述了象棋的规格和工程文件之后&#xff0c;我们继续深入的从代码开始学习cocos2dx首先从程序入口main函数开始main函数int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow) {UNREFERENCED_PARAMETER(h…