为什么要加一个throw()到你的函数中?

这是异常规范,只会出现在声明函数中,表示这个函数可能抛出任何类型的异常

void GetTag() throw(int);表示只抛出int类型异常
void GetTag() throw(int,char);表示抛出in,char类型异常
void GetTag() throw();表示不会抛出任何类型异常
void GetTag() throw(...);表示抛出任何类型异常

void GetTag() throw(int);表示只抛出int类型异常
并不表示一定会抛出异常,但是一旦抛出异常只会抛出int类型,如果抛出非
int类型异常,调用unexsetpion()函数,退出程序。

假如你加一个throw()属性到你的永远不会抛出异常的函数中,编译器会非常聪明的知道代码的意图和决定优化方式。考虑下面的代码:

显示代码打印01 class MyClass

02 {

03     size_t CalculateFoo()

04     {

05         :

06         :

07     };

08     size_t MethodThatCannotThrow() throw()

09     {

10         return 100;

11     };

12     void ExampleMethod()

13     {

14         size_t foo, bar;

15         try

16         {

17             foo = CalculateFoo();

18             bar = foo * 100;

19             MethodThatCannotThrow();

20             printf("bar is %d", bar);

21         }

22         catch (...)

23         {

24         }

25     }

26 };

当编译器看到这个带"throw()"属性代码的时候,编译能够优化这个"bar"变量,因为它知道从MethodThatCannotThrow()函数中不会抛出任何的异常。如果没有这个throw()属性,编译器必须创建这个"bar"变量,因为假如MethodThatCannotThrow抛出了一个异常,这个异常句柄可能会需要依靠这个bar变量。

另外,象prefast源代码分析工具能够(也会)用throw()注释去优化他们的错误检测能力----举个例子,假如你有一个try/catch而且所有调用的函数都已经标记了throw(),实际上你不需要这个try/catch(是的,假如你最后调用的函数可能抛出异常这就会有个问题了)。

转载于:https://www.cnblogs.com/spring3/archive/2012/03/08/2400950.html

throw()使用小结相关推荐

  1. 解析Objective-C中多态、动态类型和动态绑定

    解析Objective-C中多态.动态类型和动态绑定 转自http://mobile.51cto.com/iphone-285157.htm Objective-C中多态.动态类型和动态绑定是本文要介 ...

  2. struts2文件上传大小限制问题小结(引用)

    最后解决办法: 页面js控制上传文件的大小,在页面进行控制.如下代码 inputs是所有文本上传input DOM //名称信息var nameStr='';//大小信息var sizeStr=''; ...

  3. IbatisNet开发使用小结

    一. 介绍 平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题.所以很多人会使用一些ORM框架来增强项目的可维护性.可扩展性.IBatis.Net就是一个比较易用的ORM框架 ...

  4. 图片裁剪功能学习小结

    图片裁剪功能学习小结 近期有需要使用图片裁剪的功能,在使用插件和自己写裁剪组件之间犹豫了很久,后来根据需求经过反复的考虑,还是自己封装吧,毕竟自己动手,丰衣足食,对吧?嗯,??????是的!最后生成裁 ...

  5. c++ 使用throw抛出异常

    抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常.该语句的格式为: throw 表达式;     如果在try语句块的程序段中(包括 ...

  6. c++ try_catch throw

    c++ try_catch 1.基础介绍 try { //程序中抛出异常 throw value; } catch(valuetype v) { //例外处理程序段 } 语法小结:throw抛出值,c ...

  7. Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结

    文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂的应用程序,DOM 提供了大量灵活性.DOM标准是标准的.它很强壮且完整,并且有许多实现.这是许多大型安装的决定因素--特别是对产品应用程 ...

  8. java 对象池 博客_Java对象池技术的原理及其实现的小结

    一起学习 Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 T2 T3.其中T1表示对象的创建时间,T2表示对象的 ...

  9. ASP.NET MVC升级到ASP.NET Core MVC踩坑小结

    写在前面 ASP.NET Core是微软新推出的支持跨平台.高性能.开源的开发框架,它的优势不必多说,因为已经说得太多了.当然,现在依然有着数量庞大的系统运行于.NET Framework上,由于有大 ...

最新文章

  1. Spring 容器AOP的实现原理——动态代理
  2. Spring MVC--自定义HttpMessageConverter接收JSON格式的数据
  3. C++包含头文件几种方式
  4. mysql show timestamp_mysql中 datatime与timestamp的区别说明
  5. Freescale MC9S08AW60汇编学习笔记(五)
  6. 解决错误:Re-installation failed due to different application signatures
  7. OS- -死锁(二)
  8. 人口预测和阻尼-增长模型_使用分类模型预测利率-第2部分
  9. 为了养成NLP卷王,我画了一张路线图
  10. mybatis没有导入sqlsessionfactory包_MyBatis——搭建第一个MyBatis
  11. 【Redis】redis JedisDataException: ERR Client sent AUTH, but no password is set
  12. MSSQL数据库中发现D99_Tmp数据表的处理办法
  13. oracle10g em 产生log,如何创建Oracle10G EM dbcontrol
  14. 闻乐天授江州司马 [唐] 元稹
  15. 八叶一刀流·三之型·业炎击团队
  16. paip.c#.net 设置窗体关闭提醒
  17. 数据库建模工具PowerDesigner的基本使用方法
  18. 英语语法基础篇-书写规则
  19. Arduino 控制RFID读写器读写 IC卡
  20. Python—标准遗传算法求函数最大值代码实现

热门文章

  1. 数据库设计笔记——MySQL基础知识(四)
  2. [转] 常见WinCE启动失败原因分析
  3. 浙大远程教育计算机作业3,2016浙大远程教育计算机应用基础作业-3剖析
  4. python 按月份分组_django ORM queryset按月、周、TruncMonth分组
  5. sql server numeric 可存几位小数_想成为优秀SQL高手?你就差这些细节
  6. java farm tycoon_Idle Farm Tycoon
  7. ubuntu 安装kde桌面_在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法
  8. cad线性标注命令_CAD线性标注如何使用的
  9. range函数python2和3区别_range函数python2和3区别
  10. 【Ogre-windows】实例配置