忽略异常_忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目...
忽略异常
Github和Sourceforge上超过600,000个Java项目中的异常处理概述
Java是使用检查异常的少数几种语言之一。 它们在编译时强制执行,并且需要某种处理。 但是……在实践中会发生什么? 大多数开发人员实际上会处理任何事情吗? 他们怎么做到的?
在这篇文章中,我们将介绍滑铁卢大学最近的一项研究数据,该数据涵盖了来自GitHub和sourceforge的600,000多个Java项目中的异常使用。 让我们深入探讨并回答一些问题。
catch子句中的十大异常类型
嗯,听起来很熟悉? 最近,我们根据生产中1,000多个应用程序中的数据进行了数据紧缩后发布了结果 ,在其中我们检查了抛出的前10种异常类型。
在这种数据紧缩的情况下,研究人员分析了Github和Sourceforge上的Java项目,调查了catch子句并报告了发现的结果。 让我们看看数据集的样子:
catch子句中排名前10位的异常类型,来源:“ Java异常处理模式分析”
好吧,我们在这里有什么? 研究发现,在Java项目中,检查异常占未检查异常数量的几乎三倍。 不能在这里打乱编译器。 在生产数据紧缩中 ,我们看到了相反的结果,其中未检查最高例外。
这里要注意的一个重要区别是,生产紧缩考虑了抛出类型,而本研究指的是捕获类型,它可能与抛出对象不同/更高级别。
另一个见解是,开发人员经常使用Throwable和Exception类在顶级捕获已检查的异常。 情节变浓了 。
为了了解有关如何处理已检查的异常的更多信息,研究人员检查了Exception和Throwable处理程序。 捕获Exception的78%的方法未捕获其任何子类,与Throwable的84%相同。 毫无意义的catch子句。
接下来,让我们找出这些catch子句中发生了什么。 也许有希望。
“大多数程序员会忽略检查的异常,而不会引起注意”
听起来不好吗? 继续阅读。 这是研究的真实,真实,正式内容。 我们中的许多人对被检查的异常有一种刺痛的蜘蛛般的感觉,但是在软件开发中,很少有数据能够为围绕实际代码样式的问题提供冷硬证明。 除了个人经验和定性研究而不是定量研究。
下表显示了在前3个检查的异常捕获块中执行的前几个操作:
选中的异常捕获子句中的顶级操作,来源:“ Java异常处理模式分析”
我们看到日志语句和e.printStackTrace()在顶部,使它们成为检查异常捕获块中使用的顶部操作,这有助于调试情况并了解发生了什么。
臭名昭著的空渔获量吸引了他们。 Joshua Bloch在“ Effective Java”中描述了理想的情况:“为了捕获故障,异常的详细信息应包含促成异常的所有参数和字段的值”。 空的捕获块正在克服这个目的。
另一个常见用例是引发未检查的异常,该异常将替换已检查的异常。
Mario Fusco在他的Twitter提要上总结得很好:
Java开发人员在受检查的异常捕获块中所做的事情表明,如果您强迫开发人员执行不必要的smtg,则他将使smtg变得愚蠢
— Mario Fusco(@mariofusco) 2016年6月6日
但是等等,还有更多
从检查异常和未检查异常的整体情况来看,这一次仅在Github上,我们看到类似的情况,重新引发获得了更多的欢迎:
异常处理(Github)中使用的顶级操作,来源:“ Java异常处理模式分析”
总计(6,172,462)个捕获块中有20%为空。 这是很糟糕的。 将点与以下事实联系起来:在层次结构中较高级别的异常比特定类型使用的频率更高,研究人员得出的结论是:“大多数参与者似乎将异常处理作为一项任务给予了较低的优先级,或者将异常包括在他们的任务中。仅在该语言迫使他们处理检查的异常时才进行编码。”
最终,产品质量受损。
重新抛出是怎么回事?
由于在调用堆栈层次结构中引发异常是最流行的catch子句操作,因此研究人员进一步研究了哪种转换最为流行。 下表中汇总了结果:
顶级异常转换,来源:来源:“ Java异常处理模式分析”
在#1中,将Exception转换为RuntimeException。 从任何异常类型进行的大多数转换都转换为RuntimeException,从而使未检查的异常变为选中状态。
例外最佳实践
除了数据紧缩及其洞察力之外,本文还提到了约书亚·布洛赫(Joshua Bloch)处理其著名的第二版《有效Java》中的异常的准则(第9章)。 我们认为在此处列出它们也是一个好主意:
1.“仅在例外情况下使用例外”
异常在JVM上造成相当大的开销,将异常用于常规流控制是造成麻烦的原因(是的,即使许多开发人员滥用了它)。 在可执行的例外情况帖子中 ,我们详细介绍了此“常规例外情况”问题。
2.“将检查的异常用于可恢复的条件,将运行时异常用于编程错误”
这意味着,如果开发人员发现检查后的异常不可恢复,则可以将其状态包装在未经检查的异常中,然后将其抛出层次结构以进行日志记录和处理。
3.“避免不必要地使用检查的异常”
仅当通过正确地编码API无法避免异常并且没有替代恢复步骤时,才使用检查的异常。
4.“善用标准例外”
使用已经广泛的Java API中的标准异常可提高可读性。
5.“抛出适合抽象的异常”
在层次结构中前进时,请使用适当的异常类型。
6.“记录每种方法引发的所有异常”
当涉及异常时,没有人会喜欢惊喜。
7.“在详细消息中包含故障捕获信息”
没有有关JVM所处状态的信息,您无法做很多事情来确保不再发生该异常。 并不是每个人都有Takipi掩盖他们的背部。
8.“不要忽略异常”
所有异常都应导致某种行为,您还需要它们做什么?
要了解有关这些准则的更多信息,请查看上一篇有关可操作异常的博客文章 ,以及最近一次涵盖1000多个生产应用程序的生产数据紧缩的教训,以了解其日志中的内容以及遇到的十大异常 。
我们到底在看什么呢?
这项研究的数据来自加拿大安大略省滑铁卢大学的David R. Cheriton计算机科学学院的Suman Nakshatri , Maithri Hegde和Sahithi Thandra的研究论文 。
研究人员研究了780万个Github项目和70万个Sourceforge项目的数据库 ,提取了Java项目,并检查了BOA领域特定语言对catch块在采矿软件存储库中的使用情况。
数据集由数字
最后的想法
例外情况应保留给例外情况,但是……其他情况在实践中会发生。 被检查的异常变得不受检查,到处都是空的catch块,控制流与错误流混合在一起,有很多噪音,关键数据丢失了。 一团糟。
这是我们构建Takipi的主要动机, Takipi是一个Java代理,用于监视生产中的JVM,并负责使用您需要了解异常行为(以及如何避免异常)的所有信息来填补空白。
翻译自: https://www.javacodegeeks.com/2016/06/ignore-checked-exceptions-cool-devs-based-600000-java-projects.html
忽略异常
忽略异常_忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目...相关推荐
- 忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目
Github和Sourceforge上超过600,000个Java项目中的异常处理概述 Java是使用检查异常的少数语言之一. 它们在编译时强制执行,并且需要某种处理. 但是--实践中会发生什么? 大 ...
- java项目教训_[免费电子书]分析超过600,000个Java项目的经验教训
java项目教训 建立明智的错误处理工作流程需要什么? 调查和解决生产中的应用程序错误对于维持性能和可靠性至关重要. 但是,这并不意味着要花很多时间. 要理解为什么在生产中的故障排除,可这样的头痛,我 ...
- 只针对异常的情况才使用异常_如何以及何时使用异常
只针对异常的情况才使用异常 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. ...
- java异常——异常分类+声明已检查异常+如何抛出异常+自定义异常类
[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--异常分类+声明已检查异常+如何抛出异常+自定义异常类 的相关知识: 0.2)异 ...
- java退出不报异常_如何优雅的处理异常(java)?
这篇文章应该可以解答你的疑问. Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错? ...
- java中远程连接忽略证书_忽略Java中的自签名证书
java中远程连接忽略证书 我在职业生涯中遇到过几次问题,就是我们有时希望允许自签名证书用于开发或测试目的. Google的快速搜索显示了多年来无数Java开发人员遇到的麻烦. 根据确切的证书问题,您 ...
- java 开发人员工具_每个Java开发人员都应该知道的10个基本工具
java 开发人员工具 大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经制定了关于2019年学习以及如何实现这些目标的目标. 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改 ...
- 正在搜索开发人员模式安装包_每个 Java 开发人员都应该知道的 10 个基本工具...
大家好,我们已经在 2019 年的第 9 个月,我相信你们所有人已经在 2019 年学到了什么,以及如何实现这些目标.我一直在写一系列文章,为你提供一些关于你可以学习和改进的想法,以便在 2019 年 ...
- 区块链应用开发人员_每个区块链开发人员都应该了解这些Web3和Metamask用例
区块链应用开发人员 by Igor Yalovoy 由Igor Yalovoy 每个区块链开发人员都应该了解这些Web3和Metamask用例 (Every blockchain developer ...
最新文章
- Spotlight on oracle 使用
- html业内响应,html5页面
- Optional的巧用
- python分析数据走势_Python数据分析及可视化实例之个股走势预测(26)
- MATLAB系统辨识工具箱学习
- 用Node操作Firebird。
- 学画画软件app推荐_学画漫画的APP有哪些?2018动漫绘画学习软件推荐
- c语言题库-礼炮声响次数,c语言题库与答案精华版资料.doc
- 寻找百度图片搜索接口历程--one
- macd指标计算机应用,macd是怎么计算的
- 怎么看PLC梯形图?
- CSS3鼠标悬停图片360度旋转效果
- 手把手教你在Unity中实现小地图
- 亲民地理38期-江西极顶武功山(上)_我是亲民_新浪博客
- comsumer配置
- 佐冶亚理工学院计算机WeiXU博士,讲座通知:佐治亚理工大学张晗博士
- NVIDIA Tesla GPU系列P4、T4、P40以及V100显卡性能的对比
- Python 3语法小记(四)字典 dictionary
- Android 数据库知识回顾
- 《毕业生》系列之四 霸面天源迪科