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

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

腾讯游戏运营管理中心总监刘栖铜:腾讯游戏云的理想与实践 一号专车产品总监曹景辉:LBS应用仍有无限的创新空间 昆仑游戏总裁张益豪:做好中国游戏的海外代理 游族首席运营官陈礼标:重点打造全球化IP 我是怎么利用微信月收入三万以上的! 我的Y Combinator黑客马拉松之感! 最炫HTML5 JavaScript框架Famo.us融资2500万美元 看板先驱David J. Anderson:看板方法拉动互联网时代敏捷变革 《近匠》增强现实开发团队LegendTech:AR技术现已加入15元豪华午餐 微软新技术:简单修改,手机摄像头摇身变3D深度相机 Black Hat USA安全隐患盘点及黑客奥斯卡颁奖 MDCC免费展位报名火热!数量有限,征集进行中 迪游信息科技CEO张晓雷:中日游戏面面观 百余款智能电视创意类应用参赛角逐 Top13 App新鲜出炉! 微信公众平台开发——如何保证access_token长期有效? 拼的就是速度!超快HTML5 2D渲染引擎Pixi.js 一周消息树:百度“涉黄”遭警告,网盘内容审核的四种方式 微信开发商现状调查:接口限制成主要困扰 行业需求多样是最大难点 小米:海外扩张需谨慎,信息安全或成最大掣肘 AMD FX系荣耀归来 或成大众新宠! 脑洞大开:《80天环游地球》同名游戏诞生记 2014微信开发者大会 最后30个参会名额! 林仕鼎创业产品“云校”正式上线:让教育个性化、多元化、均衡化 14岁少年开发者:伍兴云的智能家居“梦” Xcode 6 Beta 6发布闹乌龙,着重改进Swift语言 当API遇到云平台,开发者面临的新抉择! 《近匠》欧朋流量宝,工具类应用开发之道 《近匠》Bmob:免费无限制的公有云服务 MDCC应用征集最新动态:3D手游成热点、硬件种类丰富 闪迪Ultra II SSD:采用TLC闪存,最低价为79.99美元 现有技能不浪费!基于Titanium的跨平台游戏引擎Platino 如何进行DropDownList绑定,谢谢! 请问一个CString的问题 那个168查分台太可恶了 WIN98与WIN2000共享一个OFFICE??? 网络连接怎么检测 能把IE浏览器最大吗?俺指的是把右上最大按钮最大化? 怎么判断表单传送的整数中不能有字符,谢谢!!! 如何把我写好的说明书放到我VC++应用程序的帮助文件中? 求最容易理解,最容易上手的数据库书籍,各位老大请指教,谢谢!! 快!快快!!来拿分呀!!!!!!!!一个简单问题。 WIN98与WIN2000共享一个OFFICE 2000??? 在Servlet中如何使用JavaBean(调用其中的方法)?主要是格式!如果网上有这方面的资料也可以告诉我,我急用,不胜感激!40分送上!(只有这些了) 请问各位:怎样才能知道某一个进程所占用的cpu比例,mem大小? 请问在恢复sql 7.0一个数据库文件时,出现Error 3624:这是什么意思?? 关于程序员考试 哪位知道怎么一行一行地读取文本文件呀!!!! 谁知道的,来帮我一下——有关网页浏览计时的问题 如何将数字变为字符串格式化输出? Websphere下使用连接池的一些问题 TNMUDP问题:怎样才能知道RemoteHost连接失败 ? 算法请教,我要调整一副黑白数字图的浓度,我是用直方图的方法好呢,还是先转成HLS在转回来好?若都不对,应该怎么做? 如何 在ASP中用ping 一个小问题 请用javascript VC++6是98年才出来的,为什么没有最新的ADO原生驱动,而通过ODBC的话速度太慢; 多媒体 谁有MPEG-4的资料! 如何实现类似资源管理器的分隔条 我是菜鸟,请教各位GG,MM?????? 我的计算字段怎么老要计算,而且经常有死循环,到底该注意些什么,在哪里控制? 如何取消鼠标右键菜单和使shift功能键无效?(紧急) 一个非常非常简单的一个问题 如何安装Jbuilder 5.0 ? 多媒体技术 chr(176)有什么用? 如何将3DMAX图片在vb窗口中显示 各位大侠,怎样取得复合数据窗口里面的嵌套表的Label名。 一个关于访问数据库很菜的问题 请教小波分解与重构,模极大值算法。 哪儿能找到com.ms.xml.*包? 动态类型判别 是怎么实现的,谁有小型模拟代码? 让程序自启动都有哪几种方式呀!各位发表发表吧!!!! sqlserver恢复问题! 有关STL的文章! 很简单的问题,送份啦!!! 求一个字符在字符串中的位置!? ********DBGrid和ADO怎样连接********* 在JBuilder 5.0中,我打开一个单独的java文件,怎么编译和运行他?用命令行方式是可以的 简单问题,applet??? 都说抽象类不能实例化,可是请看下面例子:(请大虾们解释) 谁有Borland App Server 4.51 注册码? Oracle中的奇特问题 质量均为m的A,B两物块一起沿光滑的斜面下滑,则B对A的摩擦力 A.mgsinα B μmgcosα 已知 铁氧元素质量比为七比三 求这种物质化学式 思路) 质量是6t的汽车在地面上匀速行驶,汽车行驶时受到的阻力是汽车重力的0.01倍,求汽车牵引力?(g=10N/kg) 两个人要一直将质量m=1000kg的小车沿一较长的水平轨道推上长为L=5m,高h=1m的斜坡轨道顶端,小车在任何情况下所受的所有阻力恒为车重的0.12倍,两人的最大推力各为800N,两个人一直都用最大的 如题:少量在人体胃中帮助消化的物质的化学式是什么? 一辆4吨的汽车,在平直的公路上匀速行驶,受到的阻力为重力的0.02倍,求汽车的牵引力多大?如题 两个人要将质量M=1000kg的小车沿一小型铁轨推上长L=5m,高h=1m的斜坡顶端,如图所示.已知车在任何情况下所受的摩擦阻力恒为车重的0.12倍,两人能发挥的最大推力各为800N.在不允许使用别的工具 汽车在平直公路上行驶,在第1min内平均速度为5m/s,第2,3min内平均速度为6m/s,第4min内的平均速度为10m/s,第5min内的平均速度为13m/s,则汽车在这5min内的平均速度是__m/s ①、CaCO3+H2O+CO2→Ca(HCO3)2②、Ca(HCO3)2→CaCO3↓+H2O+CO2↑石钟乳、溶洞形成所对应的化学方程式到底哪个对应哪个啊?又分别是什么流水作用?一楼的亲,看下这个,我越看越糊涂了 两个人要将质量M=1000kg的一箱货物装进离地高1m的卡车车厢内,他们找到了一个长为5m的斜面,但是没有其他更多可借助的工具.假设货物在平地、斜面上所受的摩擦阻力恒为货物重力的0.12倍,两 沉思怎么造句?80字 溶洞里的钟乳石主要形成是靠什么力量 两个人要将质量M=1000KG的小车沿一小型铁轨推 化学式中各种组成部分是什么意思? 为什么在溶洞里石钟乳上和石笋上碳酸钙沉积而在地表是碳酸钙溶蚀呢?可是在石钟乳的下端和石笋的上端并没有水的堆积啊。 平衡摩擦力后,平衡摩擦力,小车在木板上的受力应有F+mgsinθ-μmgcosθ=ma,其中F为绳的拉力,θ为木板与水平面之间的倾角.能不能画图描述一下小车在木板上的受力分析,还有μmgcosθ是什么力 [化学]这些物质的化学式或组成成分是什么?明矾 胆矾 绿矾 碱石灰 天然气 漂白粉 铝热剂 大理石 小苏大 苏大 大苏大 石灰乳 生石灰 自然界的溶洞,钟乳石等的形成有关的方程式? 可是摩擦力不是F=uN么,车速为什么有和摩擦力有关了? 大便在人的身体什么位置 溶洞的钟乳石不断生长钟乳石是生物吗 天然气,液化气,与空气的最佳燃烧配比是多少,怎么计算的,是不是气压也会影响配比如果气压影响的话那在气压变化的情况下要怎么计算 大便的主要成分是什么?有人有做过专门性的研究吗? 什么是什么的伞造句小学一年级孩子的作业,实在想不出来了,要求造四句什么是什么的伞?先谢谢您了.要求造四句呢。最好是一种植物和一种动物,例:蘑菇是小白兔的伞。 天然气与空气如何配比使之爆炸 蛋鸡粪便有些什么主要成分 小学一年级,目光怎么造句? (两种方法解答)一辆质量为m=1000kg,速度为v0=10m/s,关闭发动机后在水平地面上滑行了距离L=5m后停了下来,试求汽车受到的阻力.两种方法. 婴儿大便如何来的?主要成分是哪些婴儿刚刚出生的时候,不吃饭却拉屎,那大便怎么这么多呢? 一架飞机五分之四小时飞行800千米,一辆小汽车三分之二行驶50千米,着两种交通工具每小时各种行驶多少千米 2H2+O2=2H2O2H2=多少浓度?O2=多少浓度?2H2O=多少浓度?氧气和氢气的比例是多少才能燃烧?氧气:多少氢气:多少 因参与人体新陈代谢而消耗的气体是_______(填化学式)谢谢了! 一辆汽车总质量为1150kg,以72km/h的速度匀速行驶10km,若汽车所受阻力为汽车重力的10%,每个轮胎与路面的接触面积为0.05m²(g取10N/kg)求汽车功率若该汽车热机的效率为25%,如果不考虑热机其 高一物理学中摩擦力使物块运动但它为什么会运动啊?一个物块A在物块B上,B物块在一个光滑水平面上,若此时给物块B一个大小为F的推力且A与B之间的静摩擦力大于F,把它们看做一个整体,据F=ma 人体中含有的酸,要化学式 一辆质量为4吨的汽车在平直公路上匀速直线行驶,汽车所受阻力是汽车所受重力的0.03 倍求:汽车发动机的牵引力大小. ..有关摩擦力的..如图所示,两物体A、B叠放在水平面上,在外力作用下(外力作用在B上)一起作匀速直线运动.若A、B间的滑动摩擦系数为μ1,B和地面间的滑动摩擦系数为μ2,则μ1、μ2可能是 答案 关于人体生长激素的化学式? 质量为2t的汽车,在平直公路上行驶时所受阻力为汽车重力的0.2倍.它先在水平公路上匀速行驶2km后,关闭发动机后又滑行50m才停下.求整段路程中动力对汽车所做的功 人在电梯(一种是像楼梯一样的,一种是一个斜面)上受到哪几个力 能构成人体蛋白质的氨基酸化学式有八种,甲氨酸,缬氨酸,赖氨酸,异丙氨酸,本氨酸,亮氨酸,色氨酸,苏氨酸 求化学式…………! 屎的臭味是哪种物质,最好有化学式 有关摩擦力我国著名发明家邹德俊发明的“吸盘式” 挂衣钩如图,将它紧压在平整、清洁的竖直瓷砖墙面上时,可挂上衣帽等物品.如果挂衣钩的吸盘压紧时,它的圆面直径为3.18cm,吸盘圆面压在 用高耸,缓缓,沉思,造句 用“蓦然”造句 短一点最好不超过20字, 要使静止在水平地面上重为3N的物体移动,至少需用0.7N的水平推力;物体移动后,只需加0.6N的水平推力,就可以维持其匀速运动.则物体与水平地面的动摩擦因数是____;物体与水平地面的最大静 小学三年级造句 沉思 用 既……又…… 造句 短一点 化学方程式:2Mg=O2=点燃=2MgO给我们提供了哪些信息 用thoughtful来造句,单词的意思是沉思的. 造句(短一点的)绚丽神奇……永无止境……争奇斗艳…… 化学方程式的读法为何要用份2H2+ O2 =(点燃)2H2O每4份质量的氢气跟32份质量的氧气反应生成36份质量的水我不理解其中份质量什么意思以及怎样得到 尼古丁的化学式为CxHyNz,其相对分子质量为162,其中氢约占8.7%,氮约占17.3%,则化学式中x=____,y=____乘出来不是小数吗? 用“仿佛”造句,要短一些! 制作一个小车,在30cm高,60cm长的斜坡上滑下,至少要能滑5m远跪求答案……手工制作……目前只有木板和木条…… 什么物质占人体质量的三分之二? 用如果.就造句,要短,急呀 一个工人用200N的推力沿斜面把汽油桶推到汽车车厢上,若斜面长为5m,高为1m,不计摩擦,则推力做的功是多少汽油桶的重力为多少 已知 在某物质中铁氧元素质量比为七比三 求这种物质化学式 思路) 一载重汽车的质量的5t,它在水平地面上匀速行驶时.受到的阻力是汽车重力的0.12倍,求汽车此时牵引力的大急用
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn