说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

细微之处见真章 为什么要在try-catch-finally里加大括号

HTML文档下载 WORD文档下载 PDF文档下载
相信每个程序员对try-catch-finally都不陌生,并且都知道它是用来处理异常的。那么你是否思考过,在if这些语句里不使用大括号编译器即可解析,可是为什么在try-catch-finally里就必须要使用大括号呢?

用C语言开发的程序员通常会使用if、while、for等组建一条语句或者是一个代码块。

  1. if (x)  
  2.   M(); 
  1. if (x)  
  2. {  
  3.   M();  
  4.   N();  

然而,语言设计者好像对此并不关心。像if、while、for等这些可以作为单独的一条语句,并且被大括号包围起来的部分也可以作为单独的代码块。

无论我们对语法进行怎样的思考,try-catch-finally肯定与if等语句是不同的。try-catch-finally需要一个支撑块(braced block)。

在我们深入try-catch-finally之前,先让我们换换思绪,来思考下面的问题。明确的循环结构(looping structures):

  1. while(A())  
  2.   while(B())  
  3.     C(); 

虽然没有大括号,但是内部while语句与外部while进行了很好地组合,所以没有括号也不影响阅读与理解。但如果把这种情况应用到if语句上,就会遇到著名的“dangling else ”问题。

  1. if (A())  
  2.   if (B())  
  3.     C();  
  4. else 
  5.   D(); 

好吧,请问这样的缩进正确吗?else D()是对应内部的if还是外部的if呢?

答案当然是与内部if相匹配的,else与最近的if语句相匹配(就近原则)。编程语言中空格并不重要,但在阅读代码时常常会因为错误的缩进格式而导致理解错误。在C或者C++中我也看到写的很糟糕的宏,并且导致了“dangling-else”问题。

在语言中添加try-catch-finally,设计者希望避免“dangling-else”问题。假设如果在try、catch或finally后可以插入任意行代码,而不是放置一段代码块,那么对于这样的代码片段,你会如何解释呢?

  1. try 
  2.   try 
  3.     A();  
  4.   catch AException  
  5.     B();  
  6. catch BException  
  7.   C(); 

不禁要问,这样的缩进正确吗?B()是受保护的?我们是否应该换种方式编写呢:

  1. try 
  2. {  
  3.   try 
  4.   {  
  5.     A();  
  6.   }  
  7.   catch AException  
  8.   {  
  9.     B(); // protected by the outer try  
  10.   }  
  11. }  
  12. catch BException  
  13. {  
  14.   C();  

难道上面的也有问题?

  1. try // try without associated catch!  
  2. {  
  3.   try 
  4.   {  
  5.     A();  
  6.   }  
  7.   catch AException  
  8.   {  
  9.     B(); // not protected  
  10.   }  
  11.   catch BException  
  12.   {  
  13.     C();  
  14.   }  

不要试图提出规则来消除这些模棱两可的语法解析,而最好的做法就是使用大括号——可以轻易地避免这种歧义。

有趣的是,从语法角度来看,try代码块完全没有必要。简单地说,任何块都可以跟随着catch代码块或者finally块, try块可以作为隐式代码块。这是一个冗余让代码更可读的典型例子。try关键字可以提醒读者,说明该段控制流需要处理一些异常信息。

此外,分享一个有趣的信息。在最初设计C#语言时,是没有try-catch-finally的,只有try-catch和try-finally。如果想编写try-catch-finally,你还得这样做:

  1. try 
  2. {  
  3.   try 
  4.   {  
  5.     A();  
  6.   }  
  7.   catch AException  
  8.   {  
  9.     B();  
  10.   }  
  11. }  
  12. finally 
  13. {  
  14.   C();  

语言设计者意识到这是种常见的模式并且是不必要的冗长,所以他们允许语法糖消除外部多余的try。但是C#编译器生成的代码正如你上面编写的嵌套一样,因为在CIL层中是没有try-catch-finally。另外,在C#中,if、while等并不是个单独的局部变量声明。

来自:Why are braces required in try-catch-finally?

iOS 7将从这三方面影响IT界 超越Google,他企图将整个互联网塞进1台电脑 2013互联网安全大会议题先睹为快之CSA中国理事赵粮 移动建站工具(二):分秒钟DIY一个移动网站 2013上半年中国移动互联网报告,在线完整版 iOS开发者必备:九大设计类工具 已到“迟暮之年”?微软投资者提议两“救世主”外部候选 【SDCC讲师专访】Joseph G. Brown:云带来的软件销售方式变革 用户界面设计攻略:设计师需注意的九大要点 Google Glass的竞争对手来了:看YC演示日的五款新孵化项目! GPU Saturday技术沙龙:OpenCL程序员眼中的下一代APU架构 黑帽大会演讲中国第一人:从攻到防,从白帽黑客到创业者 15个步骤创立技术公司,并收获千万用户(完结) CTO容易犯的三大错误 谷歌艺术计划:互联网能否取代真实的博物馆? Hadoop技术沙龙:Hortonworks技术研发总监展望Hadoop 2.0 Marissa Mayer:雅虎月活跃用户增长了20%达8亿 移动用户3.5亿 气死偷车贼:脑电波防盗技术,让偷车贼无计可施 TIOBE 2013年9月编程语言排行榜:Transact-SQL首次进入前十 前Oracle总裁Charles Phillips:商业软件领域的“乔布斯” 留住你的用户:8款第三方移动推送服务 人气最旺:主流移动应用创建工具大合集(一) 不要强迫用户注册,请让他们先试用产品 Eve:基于Python的REST API框架 想扩展你的数据库吗?那么先了解一下I/O 白帽黑客将现场爆料Android系统及框架漏洞 9月13日:程序员节,一起来过节吧! 欲与Siri、Google Now比高低:微软开始打造个人助理Cortana 【开源专访】禅道创始人王春生:覆盖项目全周期,回归管理的本质 携程无线创业者大赛成功落幕 梁建章为头名“快展”颁20万奖金 Bug报告:小角色,大用处! sqlserver+asp如何实现图像的存储和显示? Just plain stupid 关于main(int argc,char *argv[]) helpme 如何对vb源代码加密 讨论,关于Swing做的Applet! SUN前途堪忧! explorer007(KKcat):麻烦一下,请把你写的游戏TANK的源代码给我发一份(lyf545@263.net),谢谢!!!! sql server中删除一条记录不成功!? Bad Dream about a Coffin 我要用delphi作个学生管理系统,大家给点意见 有声卡,为何没有声音,具体操作如何?一定加分!!!! What a country ! 交流交流多线程程序的开发经验好吗? 谁有关于ejb方面的书或者资料推荐??一定给分 Women over 50 谁编个例程给我,这50分就是谁的了。题目不难,相信高手5分钟就能做完。 jdk1.3+jswdk1.0.1 的JAVAbeans .class文件要放哪啊????? God painted it 提问:猪真的很幸福吗?要求 wywq(幸福如猪) 回答。 哪位高手做过可视电话的? VB能不能实现“一个结构体类型的数组当参数传递 Forgotten Birthd Husbands Overheard Fine 有个在多线程中使用ADO的问题。请高手们帮忙。 Suede jacket 可能是installshield的Bug! 我想去北京找个工作,请大家帮帮忙,提供点信息! 装了“猫”为何还有630错误(电话线也接了)? excel 問題 各位:数据窗口有一检索变量,现在想retrieve出所有的记录,检索变量应该怎样赋值?谢谢! linux和windows是不是只能分别装在两个分区中 关于图像处理:如何使图像锐化与柔化? 帮帮我啦! 我在使用jdbc读取数据的时候,碰到了内存溢出的问题,怎么回事呀 哪里有餐饮系统的介绍?90不够的话,先欠着,多谢了! 在两个ASP程序之间怎么传递参数? ccl2000(不帅不酷的Goblin):其实你真的很酷很帅的。 大侠帮帮我啦(关于SQL语句的问题) 关于Vxd的编译问题 用VC编的程序,一运行就说“执行非法操作”,问题出在哪里?? SQL Server有病 一个关于api的简单问题 《易佳自定义报表》用后很失望 请教各位高手一个有关报表控件的问题? 小妹向大家请教!可不可以直接在本页的代码中改变该页面浏览时的属性? 家菲猫:惊悉你昨晚惨遭不幸,被窃大量钱物,今日一天无法和你联系上,估计手机和通信录已全部丢失,如果今晚无法来我处,明早8点以前请务必携猫 MM 赶到上海南站!!! MDI文档模板和应用程序调用问题请教,大侠请进! 一个c++问题???? 请问各位高手,sqlserver2k加密的存储过程是否能解密,看到它的实际的语句?可否能跟踪加密的存储过程? 我下载了一个formula one ,发现她的界面跟excel差不多,在pb中怎么用? 高分求XML 高级编程(足本)[01.pdf到10.pdf]!!!! 同一主族的元素,原子半径与单质的熔沸点成正比, 如何判断碱金属、碳族、卤素、氮族、氧族单质的熔沸点变化? 实验室用铜和稀硝酸制取NO,反应过程中有6.3gHNO3被还原,则参加反应的铜是多少 对于同一周期的主族元素,单质的熔沸点逐渐升高,请举例说明! 为什么氧族,卤素单质熔沸点逐渐升高?氧族,卤素单质的熔沸点是否与共价键强弱有关?有的话,随着原子半径的增大,共价键应该是逐渐减弱,溶沸点也是降低啊! 丙炔制丙烯方程式 非金属的气态氢化物的热稳定性和熔、沸点分别与什么有关? 碱金属元素的熔沸点为什么卤单质是分子晶体熔沸点与分子量有关,相对分子质量越大熔沸点越高.碱金属是金属晶体熔沸点与原子半径有关原子半径越大熔沸点越高. 请问丙炔和丙烯的电子式怎么写?RT 非金属氢化物的熔沸点越高,是不是可以说其越稳定?非金属氢化物的稳定性与什么有关? 短周期,同主族非金属单质熔沸点都是第三周期大于第二周期吗 丙烯和丙炔怎样鉴别最好能有化学反应式, 弹药爆炎弹二次爆炸什么意思怪是不是会受到两次攻击比如打下去100点伤害,然后有爆炸又100点伤害{我说的是增加的那百分之65攻击}具体点, 氢化物沸点 稳定性与金属性 非金属性的关系 为什么同周期的非金属单质熔沸点随核电荷数增大而降低? 子弹撞击子弹会爆炸吗?我们都知道当两辆车的时速都很快的时候 撞击在一起 汽车便会产生惊人的爆炸力 但那里头毕竟有发动机 石油 这些易燃的东西 如果是两颗子弹相撞呢?是否也会爆炸 单质熔沸点的高低怎么比较?规律 非金属熔沸点问题..急不是说非金属性越强.熔沸点越高.可同主族从上向下熔沸点依次升高,而非金属性却依次降低.为啥?单质与元素不同?有啥不同? 子弹为什么可以爆炸啊? 元素周期表熔沸点的递变规律同一个主族是什么变化的?同一个周期是怎么变化的?我记得有一个主族熔沸点是先增大后减小,有吗?最好能给出图答的好可以再加分 碱金属和卤素熔沸点及密度变化规律只需简单的说一下就好 不要一大篇 说了半天看不懂的那种 就说碱金属和卤素熔沸点和密度随着质子数变化得规律就好啦^ω^ 子弹焚烧时会不会爆炸 怎么从元素周期表中看氧化物熔沸点的大小 如何通过熔沸点判断金属(非金属)性的强弱? 子弹的燃烧爆炸需要外界的氧气参与吗?1,子弹内部火药燃烧是与(氧气反应)还是和(氧化剂反应的)?2,这些氧气或氧化剂来自哪里或储存在哪里?因害怕摆渡不给显示分白扔, 求元素的,半径大小,还原性,氧化性,熔沸点在化学元素周期表规律如题 碱金属单质的熔沸点随着核电荷数增大而降低为什么是错的? 子弹爆炸我有两颗未爆炸的实弹,在什么情况下会爆炸?很怕有意外 物体的熔沸点在元素周期表的规律是什么?说的简单些,我是高一的,告诉我规律就行了,不用说那种很难懂的定理的 为什么碱金属的熔沸点低1)为什么碱金属的熔沸点很低?2)为什么随着核外电子数的增加,沸点越来越低3)沸点与金属键有什么直接的关系?沸点到底与半径有没有关系啊? “拆下轴承,浸在柴油或汽油中彻底清洗后,再用干净汽油清洗一遍,要注意哪些问题 元素氢化物的稳定性,沸点,还原性,酸碱性在元素周期表内呈现怎样的递变规律请帮我归纳下我还会加分 碱金属熔沸点问题碱金属周期表上从上到下,相对原子质量上升,即分子间作用力不断增大,熔沸点升高,但实际上熔沸点下降,为什么? 能用汽油洗轴承吗?我的悠悠球是天马神弓,正想洗洗轴承(因为睡眠时间才30秒)我一个朋友说可以用汽油来洗轴承的。我想知道的有以下几点。1、可以用汽油洗轴承吗?2、洗了以后会生 非金属氢化物稳定性与熔沸点有无关系 丙烯的化学式? 悠悠球可以用汽油洗轴承吗?怎么洗?雪鳞锋洗了有什么好处 比较两相邻元素的非金属性强弱可否用氢化物的沸点来判断?注意是相邻的两个元素 丙烯化学式:结构式? 汽油比柴油更容易着燃,为什么汽油机还需要点火? 为什么水的沸点即液态的沸点,比气态的沸点高?请回答, 烷烃,环烷烃,芳烃,炔烃,乙烯,丙烯,丁二烯,苯,甲苯,二甲苯,乙醇,的化学式怎么写?按顺序写, 柴油冻结是什么原因? 同主族氢化物熔沸点与氢化物稳定性的关系RT 不考虑氢键的N O F情况下 为什么从上至下氢化物稳定性降低而氢化物熔沸点升高 不应该是稳定性高的熔沸点也高么 乙烯的化学式为了方便回答者准确理解,请您对问题标题或内容进行补充. 怎么分辨柴油型号有没有什么测量仪器?请各位高手给予解答!万分着急 谢谢了 单质的熔沸点与元素周期律有什么关系? 如何利用乙烯,丙稀,乙炔,丁二烯等简单的有机物合成2-甲基-2-丁烯? 不同型号的柴油能不能混合使用 什么因素影响同组元素单质的熔、沸点如氧族单质熔沸点依次升高能不能从原子内部结构作答 实验室制取NO的反应离子方程式是______,检验NO的方法及现象是______. 在元素周期表里,怎么判断熔沸点高低. 第一主族和第七主族元素单质熔沸点变化趋势相反的原因 实验室制取NO必须用排水法,由此得出 -单选题a.NO难溶于水 b.NO的密度和空气接近 c.NO会与氧气反应 元素周期表中单质熔沸点变化规律氢化物熔沸点变化规律 碱金属熔沸点为什么递减?而卤素相反? 为什么实验室制取CO、N2、(NO)时只能用排水法收集? 元素周期表中元素单质熔沸点规律.说明白点. 为什么c族元素不像卤素和碱金属单质那样熔沸点有规律? 在实验室制取NO,和NO2气体时,分别用什么来收集
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn