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

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

IoE Day侧记:想开发智能硬件?先要弄明白这几个问题 【问底】许鹏:使用Spark+Cassandra打造高性能数据分析平台(二) 微软承诺所有Lumia WP8设备将升级至Win10,用户会买账吗? 周末,深圳微信开发者大会等您来!(参会必读+名单) 营造云安全生态链 第五届云安全联盟高峰论坛在京顺利召开 中国大数据六大技术变迁记 【最具价值CTO评选秀】当当网CTO熊长青:结合行业及技术发展,规划技术方向 社交颠覆传统,环信技术交流沙龙纪实(组图) 揭秘经典案例炼成之道 微信开发者大会精华回顾 从一家电子商务网站学到的经验教训 【最具价值CTO评选秀】极路由CTO康晓宁:极客转型CTO的感悟 盘点这些年来的“微信万能论” 《近匠》亲加通讯云:IM即时通讯API的极致服务者 TCL杯HTML5智能电视开发大赛完美落幕,8项获奖应用大揭晓! Xcode 6.2 Beta发布,支持WatchKit的iOS 8.2 SDK来了! 【最具价值CTO评选秀】携程高级技术副总裁叶亚明:从呼叫中心到移动互联网的演进 为什么靠谱的公司都应该参加CTO评选? 【深度剖析】微软开源.NET:战略重心已从PC转移到云端 专访POWER 8编程挑战赛选手黄文超:非科生的编程算法之路 BDTC 2014干货精彩不断,四大全天技术论坛议题全面曝光 全功能API!开源2D游戏引擎Firmament 微信公众平台新增“微信连Wi-Fi”功能,打通线上线下闭环 马化腾:微信在一线城市活跃 QQ增长从城市到农村 承包MIPS开发!Imagination发布双Codescape MIPS SDK 不任性了!Google Play宣布开通国内开发者通道 脑洞大开!用Swift写个Material Design组件库 美国最大婚恋网站eHarmony利用Hadoop、OpenStack重构自己 每个Java开发者都应该知道的5个JDK工具 异构计算应用研讨暨OpenCL编程培训在上海和西安成功举行! APIs.io:用来发布和发现API的利器 偏爱MySQL,Nifty使用4个Web Server支撑5400万个用户网站 急问Flash. ADOCE怎样访问excel数据表格? 请 ccmoon(IzuaL) 和 cloudchen(陈系上) 进来领分, 我该怎么做? 关于将输入字母转换为大写的问题! 谁给我解释这个sql语句! 怎么将sql server 6.x 的备份文件,恢复到sql server 7上 请教pb中有没有模式窗口和非模式窗口的概念?? 设备内容句柄在Delphi中有这个类吗?如何表示? hxzhappy(冰雨)快来接分 请问在contexMenu控件中show方法如何写 请问用VC,如何在WIN2000下连接一个SQL数据源? 入参与出参 关于国外发布的软件,可以使注册用户在线或取注册码! win2000下怎样建立代理服务器 有关DBGrid的问题。 在其他版看到一个很有意思的贴子“如果是你招聘人,你会不会招和自己技术,资历差不多的,甚至超过自己水平的?”欢迎大家讨论。 急!关于innerhtml的错误? hxzhappy(冰雨)快来接分 在线求助,急 请教各位,我的sybase的数据库的log设备(即syslogs表)最近增长很快,每天增长40多兆,如何解决??? 想做一个网络代理上网 c语言中三维数组的问题??? 求助:word文件加密后忘记密码如何打开原文件? 请教 : photoshop 中--highlight shadow midtone 提问,非高手勿入,打印的问题,100分,不够另加 关于oracle预留字作字段名的问题。 ● 求助,2000 Professional一登录就自动注销,怎么解决? 一个很棘手的问题? 谁给我解释这个JS函数 請高手幫改寫一段datagrid程序. (100分相送) (2)菜鸟问题!!容易拿分呀!! 如何在SQL SERVER上实现ORACLE中的package的功能 对windows编程,如何控制鼠标箭头阿 在2000下,希望不同的账号登陆,文件的可见属性不一样,能做到吗? 页面元素隐藏的问题 急 读文本出现乱码??? 高分求演示制作软件一个,以前知道lotus123可以做,可是找不到下载!!! 如何使窗口最大化? 请问:怎样使jar包里的类能读取同在此jar包中的一个xml文件 关于table 如何远程执行ORACLE上的存储过程? 有关toolbutton的用法 公布我公司的MS 2000技术支持客户号,呵呵! 关于使用组件是出现“没有注册类别” 高分求数据库操作类(查询、更新、事务等),共同提高。分不够可载开贴! error C2065: 'CMyPointDoc' : undeclared identifier 请帮解决! open_cusors问题,超过了open_cusors的最大值!! win2000 professional and win2000 advance server 如何判断某一个TEDIT获得了焦点???? 怎么不能重复的启动、停止钩子 谁有印刷方面的英语, 为什么电热水袋烧水有嗡嗡声,不是那种沸腾的声音,为什么啊,正常吗 带合的成语有哪些 带合的成语有哪些成语 personal 和individual的区别 金属棒ab、cd与足够长的水平光滑金属导轨垂直且接触良好,如图,金属棒ab、cd与足够长的水平光滑金属导轨垂直且接触良好,匀强磁场垂直导轨所在的平面.ab棒在恒力F作用下向右运动,则 abdca 把一个正三角形分割成9个小正三角形,画出草图 电热水袋加热时间过长会不会有危险? 草图大师 怎么画不分割面的线从面上穿过的线都被切割成几段,怎么才能一下子过去不分段啊 Person的用法、person 的.用法....与People有什么不同.近义词是那些? a big person和a large person的用法是什么看big和large时被这句话绕昏了:a big person 未必large,相反a large person未必big. 台湾花莲地震致2人受伤 已发生余震2中国科学家研制出可使生物隐形的“隐身中国艺术市场面临新突破:渴望与财富深镇海炼化计划4年投入12.5亿实施2公司最低注册资本限制取消 验资业务受英国房价一年上涨5.8% 专家警告“伊朗“巴斯基”武装力量在伊展开演习 国际刑事法院再次推迟肯尼亚总统出庭受评论:解决伊朗核问题需要信任和耐心美将俄歌星列入黑名单 俄抗议表示不可中国好声音华少演喜剧 不拼舌头拼演技隆重纪念孙中山诞辰150周年NBA战报夫妻购彩中800万回家团聚家有二孩的“美好时光”亚太领导人非正式会议又一名“红通”逃犯落网回答常委犀利提问朱芳雨有望绿茵场献技如何解读前三季度广州GDP的数字?17岁华裔与澳神童发现新定理下乡化解纠纷
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘