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

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

谷歌眼镜开箱评测:比想象更精致 Pinterest谈实战经验:如何在两年内实现零到数百亿的月访问 初创公司Instart Logic:专为电子出版商和网站站长解决“痛点” 未来即卖芯片又卖服务!Intel收购软件厂商Mashery 继MSN之后,微软又开始整合Skype与Lync服务 阿里将推AMOS智能机 斥资10亿鼓励开发App AMPLab开发重构的Hadoop版本Tachyon:吞吐量要比HDFS高300多倍 一名理科生的创业路 十大界面原型与布局工具 Google产品经理Kenneth Norton:如何与工程师共事 如何创建自适应系统来增强用户体验 Jolla下月展示首款Sailfish手机 将重点发展中国区 海外1GB大容量游戏,国内渠道如何分发? 真正的能源大户是WiFi网络 数据中心只是“伪军” CloudFlare创始人传奇人生:7岁编程,法学博士,获哈佛商学院最高荣誉 2013云计算深入实践 jQuery 2.0发布 不再支持IE 6/7/8 Google再发力,更新Dart M4! 【多图】鼠标、光驱等13个即将消失的PC技术 直击OpenStack美国峰会:分享五大经验收获 Project Savanna:让Hadoop运行在OpenStack之上 看Go桌面技术副总,如何解读Facebook Home 增长最快的游戏公司Supercell 你学得会? 移动周报:为什么我们出不了IT神童? AWS、VMware和OpenStack谁是赢家? 消息称苹果正在寻找新任CEO取代库克 请别人云亦云 PC仍然重要且活得很好 比预想晚几年!IBM x86服务器或终将卖给联想 App推广的节操呢? iMessage垃圾短信产业链暗访 Apkudo CEO访谈:免费为Android开发者提供测试 Web API核查表:设计、测试、发布API时需思考的43件事 执行delete后,为什么没有释放内存空间 我又一次糊涂了 关于工具条中加控件,并设定控件大小的问题(100)! 老问题,刷新时的重复添加,有好的解决方法了吗? what????this is redhat6.0 如何看分析解释语句,,谢谢,,100分。 搜索的问题 vb中文件保存的原代码是怎样的? 请教各位高手以及愿意帮助我的各位前辈们! 请问报表设计器是怎么用的? 请教!delphi4 是否可在windows xp 环境下安装? 创建EJB Test Client 的问题》???怪啊 用CSS可以改变table中的字体颜色吗? 在delphi中怎样注册一个ocx控件,用代码如何实现!!! 如何找到文件? 請問怎樣知道SQLServer里IMAGE字段是否為空 救命啊!开发gis系统需不需要后台数据库 散装赛扬III配的原装Intel风扇的问题 急!!!百分求解window api中CHOOSEFONT与LOGFONT关系。 问一个vc中CRecordset定义问题 怎么通过程序改变REMOTEDATACTL的属性? 请问如何在JSP中实现邮件的收发?(涉及到密码验证的问题)我已经郁闷很久了! 如何得到另一个进程中的线程正在使用的tcp/ip端口? **好像有一个网址可以自由上传30M以下的软件,请问有谁知道这个网址?????** Unicode的问题???? db 库文件被破坏,请教高手? 本人刚接触vc,紧急求助! 请问,如何将简体字的网页,转换为繁体字的网页? 请教vb3秒精确定时问题? 哪位大侠能在今天内急救!!关于asp.net的数据验证和数组传送问题 lihonggen0(李洪根,用VB,标准答案来了) 密码被人盗用 在Delphi中用ADO怎样连接Excel表 x++等的问题。 当一个数据库数据更新后如何通知所有连接到此数据库的用户来更新自己? 一个有趣的问题 奉献100, 现在手头有个程序,关于附件上传! 如何判断A字符串中是否包含B字串? 做个类似的邮件发送程序 快快就我 怎样同时新增主从两张表的数据? vb.Net中的几种类型集合中,那种适合于用Index和Key来索引?我怎么觉得.Net的CollectionBase还没有vb6的Collection好使? 为亚洲雪耻,为中国队加油!! 紧急求助:在那儿可以找到关于字体文件的文件格式!!! 测试adoconnection是否已关闭 请教各位大侠! 关于表设了密码的问题 开始了吗?开始了吗?北京的高程考试报名开始了吗? 如何自定义数据类型? 图片显示不了了 java 线程,对当前线程(非主线程)调用sleep,为什么主线程(窗口)也没反应了 各位大虾帮忙呀,哪位把下面的文字翻译成准确的英文,200分相赠!!!决不食言!!! 蓄热式推钢加热炉和蓄热推钢式加热炉有区别么?两者是一个意思么 能把化学化工物性数据手册,无机,有机发给我吗?急用啊,wangxinfeng-1990@163.com 蒸馏时为什么要弃去开始馏出的部分液体? 推钢式加热炉150mm*150mm规格的钢坯,出钢的时候为什么会成长方形 二级建造师问题管道强度试验与严密性试验供热管道功能性试验中包括强度试验和严密性试验,强度试验在1.5倍设计压力下无渗漏无压力降为合格.但是,严密性试验在1.25倍设计压力下稳压1小 制取蒸馏水后,为什么要先移走酒精灯,在制取前,为什么要先弃去刚开始蒸馏出的部分液体? 什么物质分解可以同时得到碘酸钠和碘化钠 液压系统中工进什么意思 吸附器属于什么品种的压力容器?设计压力2.2,设计温度60,壳程介质H2等. 溴化锂制冷机由什么材料组成,是铜 ,铁 还是? 什么叫做中工?我在一些理发店外面的招聘启示上写着招聘中工,到底什么是中工- - 海藻中有丰富的碘,2NaI+Cl2═2NaCl+I2是实验室从海藻中提取碘单质的反应方程式.还原剂是我觉得是氯气,但是化合价变高的才是还原剂啊,我纠结了。 反应釜有什么作用,怎么使用 铜耐酸碱么,表冷器的铜管,通过弱酸水,腐蚀掉了.请问, Cl2与I2能反应吗?(碘溶液中通入氯气)注:氧化性 Cl2> IO3->I2 为什么这样反应:5 Cl2+I2+6H2O=12H+ +2 IO3-+10Cl- 加氢反应釜起什么作用.它的工作原理是什么?(山梨醇生产用) 请问汽车制动液会腐蚀铜管吗 我只知道对刹车系统的金属和非金属材料没有腐蚀性,但刹车系统的金属不是铜,到底汽车制动液会不会腐蚀铜? 海藻中含有丰富的碘,"2NaI+Cl2═2NaCl+I2"是实验室从海藻中提取碘单质的反应方程式,海藻中有丰富的碘,2NaI+Cl2═2NaCl+I2是实验室从海藻中提取碘单质的反应方程式.还原剂是 什么是电加热炉您回答的是电加热导热油炉,那是属于电加热炉的一种吧,有没有总体的概括啊? 防止铜管腐蚀的方法有哪些? 氦气检漏仪的工作原理真空镀膜检测腔体漏气 反应加热炉大小的指标是什么? 请问能不能把化学化工物性数据手册发给我?无机跟有机的都要.. 直径2米气球需要多少氦气/氦气才可以升空?1.假设球的重量为5KG,2.球体的体积公式?3.氦气/氦气的密度?4.另外球体表面积公式?5.要多少氦气,氢气? 模具电磁感应加热炉有什么缺点?目前使用电磁感应炉加热模具是一种趋势,它有高效节能省时等诸多优点,求行家指点一下它有什么缺点. 亚硫酸钠会腐蚀铜管? 数控车床车圆弧时要保证圆弧的精度,但是刀具的刀尖有R角,其中涉及到对刀和半径补偿的问题,求高手帮我. 加热炉用什么加热炉长3.5米 宽2.5米 5米 加热方式(电/油/燃气或其他)哪种更经济高效加热国标类钢材型材(方通/圆管),升温至400度左右一般需要多长时间,以及其他注意事项, 制取蒸馏水时,为什么要弃去开始馏出的部分液体 什么是单位质量内内能相同?详细些.我才初三,不是很懂,但我看见有蛮多题都有提到,到底是什么意思 什么叫加热炉热效应 实验室制取蒸馏水为什么弃去开始的部分液体实验室制取蒸馏水时,加热烧杯,弃去开始流出的部分液体,再用锥形瓶收集,这是为什么?为什么开始收集的不纯?其中混有什么? 谁能帮我写一篇作文叫《如菊的-----》 求做轧钢加热炉温度均值控制系统课设 保护环境 寄语未来的明信片怎么写?写什么? 0.5NA个氯气分子的物质的量的多少?11.2L 02所含的原子数目为NA这句话对吗?0.5MOL H20含有的原子数目为1.5NA对吗?18GH20含有的水分子数目为NA对吗? 求求求求求急:轧钢上的加热炉高压冷却水管焊口开了,但是水还很烫,又不能停产,怎么能解决裂缝呢?怎么焊接? 操作题第一小题怎么画,画纸上发过来 实验室里洗净烧瓶之后为什么要用蒸馏水润洗?不洗有什么影响? 碘化钠中碘的化合价是多少? 怎样在一张纸上画出最多的花?(创新题) 波程差的定义是什么? .次碘化钠和碘酸钠如何分离?用碘单质和烧碱反应得次碘酸钠和碘化钠,然后怎么把二者分离开来,或者是否可以加热把其中的次碘酸钠分解为碘化钠?/我知道了我现在目的是要制取碘化钠我用 液氧低温储罐里面的空气怎么去除干净 管程的定义 有一位哲学家在对世界赞美时在纸上画下了?有一则寓言说,文学家,科学家,企业家和哲学家聚会是有人提议,各自用一句话来描述和赞美世界.文学家说:“这世界真是太美了!”科学家认真的说 内筒体是常压平盖储存容器,介质为极度危害的;夹套是0.2Mpa压力,介质是蒸汽,请问是几类压力容器? 阀门安装前的试验强度试验和严密性试验的压力和持续时间是怎么规定的? 写纸上.照下来.必赞 化学化工物性数据手册,无机,有机,发给我吧 谢谢 yanghouyin@163.com 阀门强度试验和严密性试验先做哪个? 不锈钢水箱会不会生锈?304材质的水箱会生锈吗?壁厚和使用寿命成正比吗? 请问谁有化学化工物性数据手册(无机和有机)的哦,发给我哦,谢谢!yanting721@163.com请各位帮帮忙哦,十二分感谢!!! 阀门强度和严密试验先强度或是严密? 求素描大神,帮忙将下面那画,画成素描,画在纸上,然后拍下来 发出来就可以了画纸上面拍下了可以不要背景 各位好心人,谁有化学化工物性数据手册,无机,有机,发给我吧 谢谢 zhongmianjun@163.com谢谢 谁有化学化工物性数据手册请发给我呢,谢谢哦!~~mmtt0249@sina.com 23、24、25、26求过程 写纸上照23、24、25、26求过程 写纸上照下来下来.必赞 能不能也给我发一个《化学化工物性数据手册》,非常感谢,我的邮箱nygbook@163.com 离子反应式 将1mol氯气通入溶有1mol溴化亚铁的溶液中:⑵向NaHSO4溶液中逐滴加入Ba(OH)2溶液至中性,在以上中性溶液中,继续滴加Ba(OH)2溶液,⑶向Ba(OH)2 溶液中逐滴加入NaHSO4溶液至恰好不再生成沉
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘