忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目

Github和Sourceforge上超过600,000个Java项目中的异常处理概述

Java是使用检查异常的少数语言之一。 它们在编译时强制执行,并且需要某种处理。 但是……实践中会发生什么? 大多数开发人员实际上处理任何事情吗? 以及他们如何做到的?

在本文中,我们将介绍滑铁卢大学最近的一项研究数据,该数据涵盖了来自GitHub和sourceforge的600,000多个Java项目中的异常使用。 让我们深入探讨并回答一些问题。

catch子句中的十大异常类型

嗯,听起来很熟悉? 最近,我们根据生产中1,000多个应用程序中的数据进行了数据紧缩后发布了结果 ,在其中我们检查了抛出的前10种异常类型。

在这种数据紧缩的情况下,研究人员分析了Github和Sourceforge上的Java项目,调查了catch子句并报告了发现的结果。 让我们看一下数据集的样子:

TopExceptionsCaughtInCatchBlocks

catch子句中排名前十的异常类型,来源:“ Java异常处理模式分析”

好吧,我们这里有什么? 研究发现,在Java项目中,检查异常占未检查异常数量的几乎三倍。 不能在这里打乱编译器。 在生产数据紧缩中 ,我们看到了相反的结果,其中未检查最高例外。

这里要注意的一个重要区别是,生产紧缩考虑了抛出类型,而本研究所指的是捕获类型,它可能与抛出对象不同/更高级别。

另一个见解是,开发人员经常使用Throwable和Exception类在顶级捕获已检查的异常。 情节变浓了 。

为了了解有关如何处理已检查的异常的更多信息,研究人员检查了Exception和Throwable处理程序。 捕获Exception的方法的78%没有捕获其任何子类,与Throwable的84%相同。 毫无意义的catch子句。

接下来,让我们找出这些catch子句中发生的事情。 也许有希望。

“大多数程序员会忽略检查的异常,而不会引起注意”

听起来不好吗? 继续阅读。 这是研究的真实,真实,正式内容。 我们中的许多人对被检查的异常有一种刺痛的蜘蛛般的感觉,但是在软件开发中,很少有数据可以为围绕实际代码样式的问题提供冷硬证明。 除了个人经历和定性研究而不是定量研究。

下表显示了在前3个检查的异常捕获块中执行的前几个操作:

TopOperationsCheckedExceptions

选中的异常捕获子句中的顶级操作,来源:“ Java异常处理模式分析”

我们看到日志语句和e.printStackTrace()在顶部,使它们成为检查异常捕获块中使用的顶部操作,这有助于调试情况并了解发生了什么。

臭名昭著的空渔获量吸引了他们。 Joshua Bloch在“ Effective Java”中描述了理想的情况:“为了捕获故障,异常的详细信息应包含促成异常的所有参数和字段的值”。 空的捕获块无法达到这个目的。

另一个常见用例是引发未检查的异常,该异常将替换已检查的异常。

Mario Fusco在他的Twitter提要上总结得很好:

但是等等,还有更多

从检查异常和未检查异常的整体情况来看,这一次仅在Github上,我们看到类似的情况,而重新引发获得了更多的欢迎:

异常处理(Github)中使用的顶级操作,来源:“ Java异常处理模式分析”

异常处理(Github)中使用的顶级操作,来源:“ Java异常处理模式分析”

总计(6,172,462)个捕获块中有20%为空。 这是很糟糕的。 将点与以下事实联系起来:在层次结构中,较高级别的异常比特定类型使用的频率更高,研究人员得出的结论是:“大多数参与者似乎将异常处理作为一项任务给予了较低的优先级,或者将异常包括在他们的任务中。仅在语言强迫他们处理检查的异常时才进行编码。”

最终,产品质量受损。

重新抛出是怎么回事?

由于在调用堆栈层次结构中引发异常是最流行的catch子句操作,因此研究人员进一步研究了哪种转换最为流行。 下表中汇总了结果:

WrappingExceptions

顶级异常转换,来源:来源:“ 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab积分

yint(fx,x,a,b);%函数表达式,自变量,下限,上限注:求得到y为sym类型,不是数值,可以使用subs转换如:subs(y,1); subs(y,a,1);%第一个给y赋1,第二个给y中的a赋1

最长有序子序列—动态规划算法

动态规划使用范围:(http://baike.baidu.com/view/28146.htm) 任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效…

Codeforces 666E. Forensic Examination

Description 给出串 \(S\) ,和 \(m\) 个串 \(T_i\) ,每次询问 \((l,r,pl,pr)\) 表示 \(S[pl...pr]\) 在 \(T[l...r]\) 中哪一个出现次数最多,求出现次数和编号题面 Solution 基础题... 对于 \(S,T[l...r]\) 放在一起建广义后缀自动机 然后每次倍增到 S[pl,pr] ,然后查询子树内出…

Matlab控制精度

控制精度matlab控制运算精度用的是digits和vpa这两个函数digits用于规定运算精度,比如:digits(20);这个语句就规定了运算精度是20位有效数字。但并不是规定了就可以使用,因为实际编程中,我们可能有些运算需要控制精度,…

虚拟机环境下DPDK运行时的一些错误解决

在绑定网卡到DPDK模块时 报错 &#xff1a;is active. Not modifyingRouting table indicates that interface 0000:02:01.0 is active. Not modifying 解决方法&#xff1a; ifconfig <网卡名称> down 运行testpmd时无法分配内存&#xff1a;EAL: Error - exiting with …

ACM 网址和一些建议

USACO http://ace.delos.com/usacogate 美国著名在线题库&#xff0c;专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学在线题库&#xff0c;唯一的中文题库&#xff0c;适合NOIP选手 ZJU http://acm.zju.edu.cn/ 浙江大学在线题库 JLU http://acm.jlu…

使用Boxfuse轻松在云中运行Spring Boot应用程序

几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在服务器而不是我自己…

Matlab各种求和

%普通求和sum(x);sum(x,1);sum(x,2); %累加求和cumsum(x);cumsum(x,1);cumsun(x,2); %累加求和的结果可以用diff实现逆运算

JavaScript内置对象Date----格式化时间

格式化时间日期: function getDate(dt) { //获取年份 var year dt.getFullYear(); //获取月份 var month dt.getMonth(); //获取日 var day dt.getDate(); //获取小时 var hour dt.getHours(); //获取分钟 var minute dt.getMinutes(); …

Matlab求欧式距离

pdist(x,‘euclidean’)1. %该函数还可以求其他距离&#xff0c;详见help2. %该函数得到的是一个向量&#xff0c;可以用squareform(Y)函数转换为对称矩阵形式。

川流不息

网站收藏&#xff1a; 1、站长网 网页教程与代码 2、博客制作 3、Java实例编程 贪吃蛇游戏开发视频教程

dao层通用封装_DAO层–救援通用

dao层通用封装泛型可以是使用编译时验证&#xff08;类型安全性&#xff09;的功能来创建可重用代码的强大工具。 不幸的是&#xff0c;我感到主流开发人员仍然对此感到恐惧。 但是&#xff0c;比喻海格的蜘蛛&#xff0c;我会说&#xff0c;泛型是被严重误解的生物……:-) 我…

(转) Linux 内核运行参数修改——sysctl命令

原文&#xff1a;https://blog.csdn.net/u012707739/article/details/78254241 sysctl命令被用于在内核运行时动态地修改内核的运行参数&#xff0c;可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项&#xff0c;用sysctl可以读取设置超过五百个…

Matlab求平均值函数mean

amean(A,1) %按列平均bmean(A,2) %按行平均cmean(A(:)) %全部平均

HDU 4514 湫湫系列故事——设计风景线

一次dfs判断有没有环 两次dfs求最长路 第一次记录最长路和次长路 第二次求出答案 #include <iostream>#include <string>#include <cstring>#include <algorithm>#include <cstdio>#define maxn 100010#pragma comment(linker, "/STACK:367…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html

Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么&#xff1f; 尽管上面有暗示性的形象&#xff0c;我们也不想发动任何不必要的圣战。 当归结为编码样式时&#xff0c;大多数选择都是相当随意的&#xff0c;并取决于个人喜好。 是的&#xff0c;即使在编辑器之间制表符宽度改变了&…

Matlab数据标准化

zscore%据说就是原数据减去均值再除以标准差标准回归系数&#xff1a;1、标准化回归系数测度的是对被解释变量的重要性&#xff0c;只有标准化了&#xff0c;才能进行重要性对比。

matlab学习-线性规划

[x,fval,exitflag,output,lambda]linprog(f,a,b,aeq,beq,lb,ub) 其中f、x、b、beq、lb、ub为向量&#xff0c;a、aeq为矩阵。 min zf s.t. a*x<b aeq*xbeq lb<x<ub x:线性规划最优解 fval&#xff1a;线性规划最优值 exitflag&#xff1a;输出标…

bug单的提交

顶头信息 所属产品&#xff0c;所属项目&#xff0c;所属模块&#xff0c;影响版本&#xff0c;当前指派&#xff0c;bug类型&#xff1a;代码错误&#xff0c;界面优化&#xff0c;设计缺陷&#xff0c;性能问题&#xff0c;标准规范&#xff0c;其他&#xff0c;安全相关。bu…