C++函数异常说明

异常说明 发送邮件 出现异常 立即下载

为了能够编写适当的catch子句,了解一个函数是否抛出异常或会抛出哪些异常对函数的用户来说是很有帮助的。

而我们可以通过 异常说明 进行对一个函数的异常进行说明, 如果函数抛出异常,被抛出的异常将是包含在该说明中的一种或是从列出的异常中派生的类型。

异常说明有如下的几种形式:

1. 指定异常

T   funNname( parameterlist ) throw( T1, T2,····,Tn);

其中 T 是类型, parameterlist 是参数列表, 而类型 T1, T2,····,Tn 是函数会抛出的异常。


2. 不抛出异常

T   funNname( parameterlist ) throw( );

抛出异常类型列表为空,表示的是该函数不抛出任何类型异常。


3. 抛出任意类型的异常

T   funNname( parameterlist );

这表示该函数可以抛出任意类型的异常。


下面通过一段简单的代码来说明异常说明的特别之处

  1. #include <iostream>  
  2. class demo  
  3. {  
  4. };  
  5. using namespace std;  
  6.    
  7. double divd(int a, int b) throw(int)  //异常说明,表示函数divd会抛出类型为int的异常  
  8. {  
  9.     if(b == 0)  throw demo();         //抛出类型为demo的异常  
  10.        
  11.     return    a/b;  
  12. }  
  13. int main()  
  14. {  
  15.     try  
  16.     {  
  17.         divd(1,0);  
  18.     }  
  19.     catch(demo)                       //捕获异常类型demo  
  20.     {  
  21.         cout << " divided by zero " << endl;  
  22.     }  
  23.     catch(int)                        //捕获异常类型int  
  24.     {  
  25.         cout<<"zero"<<endl;  
  26.     }  
  27.       
  28.     return 0;  
  29. }  
这段代码的运行结果是输出:   divided by zero

奇怪了,在 divd 函数的声明中,只说明了抛出类型为 int 的异常,为什么其函数内抛出的异常类型却为demo呢? 

我们可以暂时理解为:在某函数的异常说明中的列出的类型与该函数内抛出的异常类型不完全匹配时, 但在异常处理代码中的catch有对其类型的捕获, 所以程序运行正常。

好,下面我们根据异常说明进行一些修改

  1. double divd(int a, int b) throw( )     //将throw(int) 改为 throw( )  
修改之后,编译运行,看到的输出结果还是:   divided by zero

根据上面对异常说明的三种形式介绍,我们知道在函数声明后面添加 throw()的意思是说明了此函数不会抛出任何的异常。那为什么这里抛出了而且又被捕获呢?

其实,在编译的时候,编译器不能也不会试图验证异常说明。因不能在编译时检查异常说明,异常说明的应用通常是有限的!

修改后的 divd 函数内继续编写有抛出异常的代码, 编译后再次运行程序,其输出结果也表示异常机制执行正常。
其原因就如上述所说的理解那样: 编译器不会对异常说明进行检测,异常说明更多的是写给函数的用户看,让它知道如何去捕获这个函数可能抛出的异常类型,仅给用户作参考。
而在一开始函数异常说明的类型与实际抛出的异常类型不匹配的情况中,同样由于 “编译器不会对异常说明进行检测” 的原因,所以编译通过,异常机制运行正常。

总结:异常说明还是有用的!但更多是写给函数用户看的。让函数用户清楚知道抛出的异常类型,从而更好和正确地在运用此函数时,编写对其的异常检测。


文石NoteX3国行版安装 Google Play经验分享 文石NoteX3国行版安装 Google Play经验分享。 阅读详情

相关推荐

Adversarial Texture for Fooling Person Detectors in the Physical World

本文提出了对抗纹理的想法(AdvTexture),与基本补丁攻击不同对抗纹理可以生成任意大小,可以覆盖任意大小的不了,并且纹理的任何局部都有对抗性的效果。当衣服被对抗纹理覆盖是,摄像头捕捉到的每一个局部区域都可以攻击探测器,这成功解决了片段缺失的问题。提出了一种两阶段生成方法:基于环形收割的可扩展生成攻击(TC-EGA)来制作广告纹理。第一阶段,训练一个全卷积网络FCN作为生成器,通过采样随机潜变量作为输入来产生纹理(不同于GAN中传统的生成器架构,每一层都使用卷积运算)......

weixin_49171105的博客 1067

C++异常之异常说明

为了能够编写适当的catch子句,了解一个函数是否抛出异常或会抛出哪些异常对函数的用户来说是很有帮助的。 而我们可以通过 异常说明 进行对一个函数的异常进行说明, 如果函数抛出异常,被抛出的异常将是包含在该说明中的一种或是从列出的异常中派生的类型。 异常说明有如下的几种形式: 1. 指定异常 T   funNname( parameterlist ) throw( T1, T2,····,

学无止境 5379

英飞凌AURIX™ TC3xx系列MCU的ISO 26262安全机制实战:从安全手册到代码集成的避坑指南

本文深入探讨英飞凌AURIX™ TC3xx系列MCU的ISO 26262安全机制实战应用,重点解析锁步核配置、ECC策略优化及SafeTlib库集成中的关键问题。通过代码示例和配置建议,帮助开发者实现ASIL D级别安全性,规避常见陷阱,提升汽车电子系统的功能安全合规性。

weixin_42558093的博客 403

C++异常

带你了解C++处理异常的正确方式

yue152152的博客 1090

粒子群算法实战:用Matlab解决旅行商问题(TSP)的完整代码解析

本文提供了使用粒子群算法解决旅行商问题的完整Matlab实战指南。通过将连续空间的粒子群算法进行离散化改造,采用基于交换序的策略来更新粒子位置与速度,并给出了从问题定义、数据结构设计、核心函数实现到主迭代循环的详细代码解析。文章还探讨了参数调优、性能优化及处理复杂TSP变体的进阶思路,为物流规划、路径优化等领域的工程应用提供了可直接复用的解决方案。

m2n3o4p5的博客 350

【HDLBits实战】从真值表到最优电路:SOP与POS形式在ECE241考题中的精妙应用

本文以HDLBits平台上的ECE241考题为例,详细讲解了如何从真值表出发,利用卡诺图化简技术,推导出最优的积之和(SOP)与和之积(POS)逻辑表达式。文章重点剖析了如何处理“无关项”以简化电路,并通过Verilog代码实现对比,阐述了SOP与POS形式在数字电路设计中的精妙应用与实战价值。

z2a3b4c5d的博客 214

c++异常处理(以处理除0错误为例)

一、概念异常处理的优势: 将程序逻辑&错误处理逻辑混在一起,会降低程序性能。如果没有异常发生,异常处理代码对性能的影响很小。更有效。异常处理将错误处理从程序执行的“主线”中剥离出来,提高程序的清晰性,增强可修改性。程序员可以处理任何异常——所有异常、某种类型的所有异常 或 一组相关类型的所有异常(即通过继承层次相联系的异常类型)。减少错误的可能性,是程序更健壮。异常处理必需品:

中山大学 Winnie Zha(C/C++) 8092

解决Unity与3DMax模型单位与中心点偏差的完整指南

本文详细解析了Unity与3DMax模型导入时常见的单位与中心点偏差问题,提供了从3DMax单位设置、FBX导出到Unity接收调整的完整解决方案。通过实战案例和高效工作流建议,帮助开发者实现unity与3dmax的单位统一,避免尺寸错误和轴心偏移,提升3D资源导入效率。

weixin_29015899的博客 283

C++程序设计——九

草稿

KAI_ZHAN的博客 1078

YOLOv5算法改进(21)— 添加CA注意力机制 + 更换Neck网络之BiFPN + 更换损失函数之EIoU

本节课作者就结合论文对YOLOv5进行组合改进(添加CA注意力机制+更改Neck网络之BiFPN+更换损失函数之EIoU),小白必学!

小哥谈 2820

YOLOv13保姆级教程+AKConv模块:可变形卷积+自适应核优化,mAP提升3.23%,召回率&mAP50~95显著提升(论文涨点模块已验证)

本文介绍了一种改进的YOLOv13-AKConv模型,通过引入AKConv模块显著提升了目标检测性能。实验结果表明,优化后的模型(绿色曲线)相比原模型(蓝色曲线)在mAP指标上提升了3.23个点,同时召回率、mAP50-95等指标均有明显提升。作者详细阐述了模型移植过程,包括创建yolov13-AKConv.yaml配置文件,修改tasks.py和modules/init.py文件,以及实现AKConv模块的核心代码。该模块采用可变形卷积思想,通过动态生成采样点位置来增强特征提取能力,并集成了BN和SiLU

FJN110的博客 2611

C++ 语言学习 day07 函数异常,模板,模板类

函数异常,模板,模板类,template typename

she666666的博客 552

优化相机姿态和三维点云的Bundle Adjustment算法及其编程实现

重投影误差是指将优化后的相机姿态和三维点云投影到图像平面上,与对应的图像特征点之间的距离。Bundle Adjustment(捆绑调整)是一种用于同时优化相机姿态和三维点云的算法,它可以提高三维重建和相机定位的精度。下面是一个简单的Python示例代码,演示了如何使用Bundle Adjustment算法优化相机姿态和三维点云的参数。通过以上步骤,Bundle Adjustment算法可以不断地优化相机姿态和三维点云的参数,从而提高重建和定位的精度。Bundle Adjustment算法的编程实现。

CyberXZ的博客 740

C++中函数异常规格的说明

1,本文介绍一个新的概念,它是一个重要的概念,并且是 C++ 中的一个高级主题; 2,问题: 1,如何判断一个函数(不是自己写的,有可能是第三方库中的函数)是否会抛出异常,以及抛出那些异常? 1,学习了异常处理,我们在调用一个函数的时候,就应该知道这个函数会不会抛出异常,如果会,抛那些: 2,如果是第三方库的函数,只有函数声明,没有函数实...

weixin_30530523的博客 118

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c++对的调用没有匹配的函数_C++中函数异常规格的说明

作者:子宇24链接:https://www.cnblogs.com/dishengAndziyu/p/10920150.html1、本文介绍一个新的概念,它是一个重要的概念,并且是 C++ 中的一个高级主题;2、问题:如何判断一个函数(不是自己写的,有可能是第三方库中的函数)是否会抛出异常,以及抛出那些异常?学习了异常处理,我们在调用一个函数的时候,就应该知道这个函数会不会抛出异常,如果...

weixin_39985365的博客 906

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++外传2、函数的异常规格说明

1、问题 如何判断一个函数是否会抛出异常,以及抛出那些异常? 2、 函数的异常规格说明 C++提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 ...

xiebs的博客 283

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【C++】 外传篇 2_函数的异常规格说明

函数的异常规格说明 问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++ 提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 /** 可能抛出任何异常 */ void func1(); /** 只能抛出的异常类型: char 和 int */ void func2() throw(char...

weixin_33766805的博客 128

c语言自定义char*函数返回值是乱码_C++中函数异常规格的说明

作者:子宇24链接:https://www.cnblogs.com/dishengAndziyu/p/10920150.html1、本文介绍一个新的概念,它是一个重要的概念,并且是 C++ 中的一个高级主题;2、问题:如何判断一个函数(不是自己写的,有可能是第三方库中的函数)是否会抛出异常,以及抛出那些异常?学习了异常处理,我们在调用一个函数的时候,就应该知道这个函数会不会抛出异常,如果...

weixin_33503998的博客 704

C++深度解析教程笔记16-外传:异常处理深度解析, 函数的异常规格说明 , 动态内存申请的结果

include <exception>//头文件void my_terminate()//自定义函数//exit(1);//会调用析构函数abort();//不会调用析构函数class Testpublic:Test()~Test()int main()//setthrow 1;return 0;面试题如果析构函数中抛出异常会发生什么情况?

qq_35429166的博客 836

C++笔记 外传篇2 函数的异常规格说明(C++中的高级主题)

外传篇2 函数的异常规格说明(C++中的高级主题) 1.问题 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++提供语法用于声明函数所抛出的异常 异常说明作为函数声明的修饰符,卸载参数列表后面 异常规格说明的意义 提示函数调用者必须做好异常处理的准备 提示函数的维护者不要抛出其他异常 异常规格说明是函数接口的一部分 2.问题 如果抛出的异常不在声明列表中,会发生什么? E2-1.cpp...

YLC_慕类的博客 244

C++解析-外传篇(2):函数的异常规格说明

0.目录 1.异常规格说明 2.unexpected() 函数 3.小结 1.异常规格说明 问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 异常规格说明的意义: 提示函数调用者必须做好异常处理的准备 提示函数的维护者不要抛出其它异常 异常规格说明是函数接口的一部分 问题: 如果抛出的异常不...

weixin_30297281的博客 120

CPP学习第一天

学习Cpp的第一天

luoxuezhixing的博客 785

C++ 构造函数和析构函数抛出异常的详细说明

【代码】C++ 构造函数和析构函数抛出异常的详细说明。

m0_59680769的博客 632

【C++高级主题】异常处理(五):异常说明

在 C++ 的异常处理体系中,异常说明(Exception Specification) 曾是一种用于声明函数可能抛出哪些异常的机制。从 C++98 引入到 C++17 弃用,异常说明经历了多次变革,其设计初衷与实际效果的差距引发了诸多争议。

byte轻骑兵的技术小窝 1646

【C++】外传篇2.函数的异常规格说明

问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常,(第三方库只有说明,没有对应的函数) 问题: 如果抛出的异常不在声明列表里面会发生什么? // 异常规格之外的异常 void func() throw(int) { cout << "func()" << endl; throw 'c'; } int main() {...

zhabin0607的博客 190
上一篇: delete [] 时如何知道数组长度
下一篇: Thrift 入门
nodeathphoenix
博客等级 码龄16年 97粉丝 99原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值