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

细微之处见真章 为什么要在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?

最受欢迎的游戏引擎集结号:小白篇 多盟总设计师邢开捷:四两设计拨千金 Cocos2d-x游戏《Monster Strike》终结《智龙迷城》霸榜神话 高通物联网技术解决方案:从汽车到智慧城市 Arduino携手Atmel 发布Arduino Zero开发板 以色列玫瑰:细数十位科技创新领域的女性佼佼者 8款最佳的开源在线学习CMS系统 在发布站点前,Web开发者需要关注哪些技术细节? TOCC、中航信、高德、北斗平台重磅专家登场 邀您共享ITS技术盛宴 腾讯大数据之TDW计算引擎解析——Shuffle AMD APU14 BEIJING技术创新大会精彩看点 这是云整合时代开始的节奏吗?Rackspace考虑退出 一周热点:如何使用15美元每月的机器实现百万文档检索 黑客获取数据信息的目的和进攻手段及应对之策 Surface Pro 3遭大曝光:799$起、四色可选、12寸屏幕 当软件遇上设计,浅谈敏捷UX VS.精益UX DIY“物联网”——自己动手处理传感器数据 AMD成首家X86+ARM双架构计算 欲寻新蓝海 锤子手机发布:Smartisan T1与其背后的开发团队 第六届中国云计算大会在北京隆重举行 替代笔记本的Surface Pro 3:800g、9.1mm,极致轻薄 PWorld2014:畅谈企业软件向“大平台”+“微应用”变革 微软公司全球资深副总裁张亚勤:云计算引领互联网物理化 亚马逊网络服务全球市场副总裁Ariel Kelman:亚马逊AWS云服务推动创新 终超苹果,谷歌成全球最有价值品牌 高通业务拓展总监沈周全:以软件为基础建立差异化优势 设计你所需要的,而不是你想要的 疯狂谷歌建广告天网:电冰箱、汽车仪表盘、恒温器、眼镜和手表 开发者眼中的编程语言…… 寻下一突破口?黑莓推Project Ion项目,正式进军物联网 无人驾驶汽车真的要来了:飞思卡尔研制视觉芯片 初级问题! rzhou(海盗) 收分来 大家好!!用java开发数据库!!请帮忙!! 排序问题! 1。对vcl库底层机制一些不明白的地方 可以写代码导入数据吗? 连接ORACLE数据库时候的错误提示 关于动态查询表为空时,怎样获取一个条件??最终调取一个提示框 菜鸟提问,向高手请教一个VB中SQL中的问题, 怎样显示局域网内的所有计算机 请问谁有用VMware设置好的solaris文件啊?或是那里可以下载啊??谢谢了~~ 帮帮小弟呀!!散分 在本地机遇到数据无法提交或读取的事,动网论坛的数据也无法读取,什么原因啊 寻程序员,短期,欢迎加盟!!!!!-------熟悉j2me的!!!!面试合格,待遇为150/天 关于Form的构造函数和OnLoad方法...... 请教Web Services的分布式创建和引用的问题?急!!!!! 在c#的WinForm中如何显示cdr文件,CorelDraw图片哪怕是8.0也行 在建立vc 工程的时候选择了生成hlp 文件。我把我的工程放到别的机器上的时候有如下的错误 怎么样得到游标中的数据的多少记录。 求解1000的阶乘 请问大虾有关BootCode方面的一点问题??非常急! 高分请教:如何在安装程序时注册OCX控件? 请问:在TDbgrid控件的TitleClick事件里如何取得鼠标击键的坐标位置? netwell服务器有不断的响声,急急急................. ★★请教新闻发布系统的图文混排问题 在建立vc 工程的时候选择了生成hlp 文件。我把我的工程放到别的机器上的时候有如下的错误 这句SQL应该如何写? 怎样在VC里面开发手机上程序?需要装什么软件? 请教:这个onLoad事件怎么不起反应 关于web services,大哥麻烦帮助小妹吧! 我现在神思恍惚,无心工作,天天上网灌水打发时间,大家估计我多久会失业? 使能工具栏的某项 网络下载编程求助(紧急求助) 如何判断一个字符串中是否含有某一字符? 如何在网络断开的情况下判断,等网络恢复后再自动连接??? 如何在comboBox中添加icon--在线= 救人啦!!请教BootCode方面的问题,十万火急!! 一个关于 WISE installation 制作安装程序的问题 *.lwp的文件怎么打开亚?请大家帮帮忙!!! DataGrid为何不显示? CRegKey::QueryValue()读取数值数据时遇到的问题…… chmod命令后造成启动错误 请教大家一个关于webservice transaction的实例 菜鸟急救,注册表文件导入的问题? 填空题(急) 钱本草呢? 关于手机的问题 求救:GetFieldValue()函数出错. 一个很简单的问题,来者有分 有个小问题请大家诊下 怎么样使stringgrid中的fixrows和rowcount数目一致? (另加40分!周三前给我甲、乙、丙、丁四地的相对方位是?分别处于东/西半球?满意者追加30--40分! 急求!快点儿~今天吃了两个猕猴桃,放了一个多月了.闻着没什么异味,吃着感觉有点儿樟脑球味(本人家里没有樟脑球,也从来没有买过).现在吃了两个多小时了,没什么感觉.请问有没有什么坏 苹果落地属于什么运动 (另加40分!周4前给我中国第一个南极内陆科学考察站、第三个南极科考站昆仑站(80°25′S,77°06′E),于2009年1月27日在南极内陆冰盖的最高点(海拔4087米)冰穹A地区胜利建成.它是人类在南极 我不想写作业,怎么能让我快点儿写作业, 手掌托着一小球,原来静止不动,现突然将小球上抛,以g表示重力加速度,在小球刚离开手掌的瞬间,手掌的A.加速度向下,加速度大小大于gB.加速度向下,加速度大小小于gC.加速度向上,加速度大小 哪个概念不符合温带沙漠环境特征?1.年降雨量少 2.日温差大 3.年温差小 城市和郊区相比,哪个昼夜温差大?请分析原因 苹果落地的故事我要一个55字左右的故事~ 墙角有一堆黄沙 底面A到B的长度为1.88米 且A和B到墙角的距离基本相等 高为0.8米 又知黄沙每立方米约重1.7试估算这堆沙的重量,保留2为小数 方法提示:这堆黄沙可以看成是堆成高为0.8米的圆 用英文介绍蛇 罚球瞬间,球的加速度多大?(2)接球瞬间,求的加速度多大?大家请看问题补充请给出步骤足球运动员在罚点球时,球获得30m/s的速度并做匀速直线运动,设脚与球作用时间为0.1s,球又在空中飞行0. 墙角有一堆如图所示的黄沙,底面A到B的长度为1.57米,且A和B到墙角的距离基本相等,高为0.8米 求体积急 请问什么频率的无线电对水的穿透性最好?想做一个无线电遥控水的下机器人.请问什么频率的无线电对水(淡水)的穿透性最好?请详细说明.对于超声波控制与普通的无线电比例遥控器的调解调 无,就是苹果落地是什么运动? 墙角有一堆如图所示的黄沙,底面A到B的长度为1.57米,且A和B到墙角的距离基本相等,高为0.8米 求它的体积 城市和郊区昼夜形成不同风向会使这里风力变大吗?为什么?建立水库为什么会使当地年、日温差变小? “手掌里盛住无限,一刹那便是永劫.”这话谁说的? 墙角有一堆圆锥形的黄沙A和B到墙角的距离基本相等长度为2米高为0.9m每立方米黄沙重1.7吨这对黄沙重多少吨 在一只底面半径为10厘米的圆柱形容器中,水深12厘米,要在容器里放入长和宽都是8厘米,高18厘米的一块方石1.如果把方石条横放在水中,水面上升几厘米?【得数保留一位小数】2.如果把方石 牛顿从苹果落地的事实中发现了什么?举例说明这一发现. 墙角堆放了一堆玉米.测得点A到点B之间的弧长为1.57M,且点A和点B到墙角的距离相等,玉米高为0.8M.已知每立方米玉米质量为540KG,求这堆玉米的总质量.(答案保留整数) 圆柱形容器a.b深度相等,底面半径分别为3厘米和4厘米把容起a倒入b容器水深比容器的3/4低12厘米求B高度 雨岛效应产生原因 手机怎么有时反应很慢拜托各位大神 热岛效应会加大城市日温差吗? 苹果落地的原因从力学角度分析,至少两点原因!看谁回答得最全面每个原因一句话就成 1楼回答的很全面,其实你只要回答:1.地球对地表有质量的物体有引力作用(激励因素);2.苹果有质量 这是一条蛇读英语怎么说? 晏子使楚讲的是一件什么事?楚王是个什么样的人?晏子是个什么样的人? 为何醋酸在水中没有完全电离醋酸是弱电解质,弱电解质指的是在水中没有完全电离的物质.像CACO3 Al(OH)2 都可以理解,但醋酸呢 我电话反应慢怎么办? 装修时水管和电管交叉布置且距离很近我家装修的时候水电管在底下交叉了,且砖已经铺好.这种情况需要改进吗?会不会有露电的危险. 有一种现象,是发生在夏天,有很大的雨和风.我们那叫过龙,它是怎么回事?为什么每年都有?发生在哪天?我是江西的 为什么手机现在上网反应慢了?为什么手机现在上网反应慢了? 晏子使楚讲的是一件什么事,表现了楚王是个什么样的人.表现了晏子是个什么样的人. 壹周立波秀 经典语录买得到钻石买不到爱情 那一段就是说买得到钻石买不到爱情,买得到药品买不到健康那一段,昨天才看过的,可是忘了,希望记得的人来告诉我一下,这次演讲要用 蛇的英语是? 装修中规范的走水管电管应该怎么查看?我家在装修中,正在走水电,想了解怎么才算规范的安装?例如:一根20的管中走1.5方的电线,走几根才算正确呢?电线转弯的地方应该怎么走线呢? 雨的形成 收音机入水怎么办?我用的是飞利浦aq4288,入水后开机就是在叫.也不是进很多水,我想只是面板湿了,怎样可以搞好,郁闷,现在没人会弄收音机 遥知兄弟登高处的作者是谁 雨的形成?与雨有关的奇特现象及原因?世界上哪些地方天天下雨?哪些地方终年无雨? 深海如何通讯?无线电可以通过水吗? 我家里装修时,装饰队地面布水管电管时跟辐射样,没有沿墙走,请问这样可以么 NP题库在哪里?请兄弟们给个链接, 无线电在水里的速度距离 为什么电管让水管,水让风管管 NP题库是不是以下这几个有没有错,有错的话,请问是那几个题库 高一政治重点是什么 如图,A,B,C,D,P是圆O上的五个点,且∠APB=∠CPD.AB弧与CD弧的大小有什么关系?为什么? 雨的各种奇特现象以及成因,谁知道,急用 一个球与一个正三棱柱的三个侧面和两个底面都相切,已知这个球的体积为3/32派,则三棱柱的外接球表面积为? 俺反应有时差,咋能反应快点儿? 热岛效应使雨增多的原因 蛇用英语怎么说?用音标怎么拼? 五年级上册的期末试题,英语啦,品德啦,科学啦,美术啦,多多益善!大家辛苦了,但注意:是苏教版语文.北师大版数学.PEP英语! 函数 连续与可导 有极值之间的关系 求写雪的句子 快点儿求你们了, 用手托一个物体并竖直向上抛出,在物体脱手的瞬间,球的速度和球对手的压力大小为? 青岛涉黑头目张韶军一审死刑 其余16韩国总统朴槿惠:将查清国情院涉嫌干政美媒称奥巴马支持率跌至新低 挫折积累罗马表新款岩螺多功能系列 向大海致敬“京城土豪聚会超海天盛筵美女全裸上阵江苏沿江8市今起用“苏五” 耗油量几吉林前郭地震灾区已发现2户房屋倒塌、江苏全省出现液态奶供不应求 物价上涨调查显示逾半受访香港公司明年平均加薪中国最后一个未通公路的县墨脱今日举行通讯:通往“高原孤岛”的“生命线”高薪由五毛一块凑起 过万很少聚焦激发社会投资活力:用改革撬动“活快递哥倒在送货路上香港官员:监护人代双非儿童买房应被豁复旦大学研究:PM0.5“杀伤力”盖传美国在台北设监听站 台方回应:台美宁波实现大灾之后无大疫 传染病例同比南京:空气质量不达预期将人工增雨消霾南京:承诺绿地不兑现 开发商将受处罚宁波市将新启用一批电子警察规范行车秩陈仟青:欧元哀叹GDP数据“帮倒忙”上海 | 8月3日,田野录音交流会改枪换炮来临 单狙新枪大猜想沙尘中“表情” 北京沙尘暴来袭微软的“中国式打盗版”下一个众筹成功的“大圣”在何方?李克强为何直接喊话网速太慢流量太贵?【纸牌屋329】任远专栏:新型城镇化在竞技场提高战斗力 竞技场宝宝选择很B股暴涨,揭示“价值洼地”的选股思路当张佳玮参加NBA选秀大会小帅勇闯勇气大陆 狂送1688钻石大中证500股指期货上市,小盘股将被踩不是茨冈人就别学着热衷于离别家长一心当猪,却要望子成龙【敢死队】银行地产核电向上动能充足UBI混合解决方案:数据共享是首要任八款新经文属性详解 获得方法一览盘点搭载Android 5.0的旗舰你是想对着79元的手环抱怨,还是一起奇迹暖暖与暖暖环游世界游戏特色比拼
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘