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

忽略异常

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

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

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

catch子句中的十大异常类型

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

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

TopExceptionsCaughtInCatchBlocks

catch子句中排名前10位的异常类型,来源:“ 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/335785.shtml

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

相关文章

数据结构【队列专题】

先进先出(First In First Out,FIFO)的线性序列,成为“队列”。 队列也是一种线性表,只不过它是操作受限的线性表,只能在两端操作: 一端进,一端出。进的一端成为队尾(re…

软件项目的命名规范/命名规则

文章目录项目名称目录名称包命名虚拟目录资源路径Java 代码命名属性文件 properties 命名xml文件命名jsp文件命名html文件命名js文件命名css文件命名图片文件命名数据库命名html标签的属性值命名规则项目名称 使用小串式命名法 项目名称使用英文,全部字母小写&…

数据结构【高精度专题】

// 高精度加法 // C A B, A > 0, B > 0 vector<int> add(vector<int> &A, vector<int> &B) {if (A.size() < B.size()) return add(B, A);vector<int> C;int t 0;for (int i 0; i < A.size(); i ){t A[i];if (i < B.size…

react java_独眼巨人React组织了Java 8库的寒武纪爆发

react java什么是独眼巨人React&#xff1f; Lambda表达式和默认方法在Java 8中的到来预示了Java语言十年来最大的结构性变化。 在此基础上构建了一些新的很酷的API&#xff0c;例如Stream, Optional, CompletableFuture最终Java开发人员可以以更实用的样式进行编码。 尽管这是…

oracle安装卡在create inventory_滴滴云服务器上安装Oracle12cR2单实例数据库

一、相关说明Oracle数据库是由美国甲骨文公司推出的一款优秀的关系型数据库。当前最新版为Database 19c。本文简述Oracle Database 12cR2在滴滴云主机上的安装过程。如需更权威的指导方法请参考Oracle官方安装文档。二、环境概述一台DC2云主机&#xff08;2c4g&#xff09;一个…

MyEclipse的build、clean、publish、clean(redeploy)的区别

文章目录buildcleanpublishclean(redeploy)新增了java文件或者修改了已有的java文件删除了java文件或者包修改了classes目录以外的文件build 就是将工程src目录的内容全新输出到工程的classes目录下&#xff0c;全面覆盖旧的文件&#xff0c;需要编译的会编译后再输出 clean …

jgroups_JGroups:无需额外基础架构的领导人选举

jgroups嗨&#xff0c;您好&#xff0c; 在本文中&#xff0c;我将展示如何在不使用任何其他基础架构&#xff08;例如Apache Zookeeper或Consul&#xff09;的情况下解决领导人选举的问题。 领导者选举是解决以下问题的一种常见方法&#xff1a;在分布式系统中&#xff0c;只…

【WebRTC---序篇】(二)Windows平台WebRTC源码编译

需要准备的东西 (一)一个强大的梯子(懂得都懂)!!!!!!!!! (二) 下载depot_tools Windows指定地址必须在此下载 打开这个页面,找 install depot_tools 这个关键字 请把他解压到C盘,并且设置到PATH环境变量种,且让它处于最顶端。 其他需要设置的额外变量 DEPOT_TOOLS_…

商品管理后台发布商品时,规格值组合的前端交互的实现逻辑

方案1&#xff1a;先计算总行数&#xff0c;再循环填充规格值 根据每种规格值数量计算得到总行数&#xff0c;如果下图有3种规格&#xff1a;长度、重量、大小&#xff0c;规格值个数分别为&#xff1a;3、3、2,3x3x218行。 规格种类有3种&#xff0c;于是写3层嵌套递归循环填…

python是什么牌子主机_python 收集主机信息

这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息&#xff0c;熟悉python里的文件读取&#xff0c;字符切割&#xff0c;字典存储等知识。文章结构&#xff1a;(1) 文章目的&#xff0c;需要收集的信息&#xff0c;并逐个分析如何获取信息。(2) 给出实现的pyth…

antlr idea 入门_ANTLR入门:构建简单的表达语言

antlr idea 入门这是该系列的第一篇文章。 本系列的目的是描述如何创建有用的语言和所有支持工具。 在本文中&#xff0c;我们将开始研究一种非常简单的表达语言。 我们将在语言沙箱中构建它&#xff0c;因此我们将其称为语言Sandy 。 我认为工具支持对于一种语言至关重要&am…

【WebRTC---源码篇】(五)WebRTC视频引擎

1. 视频数据的采集时间 2.视频分发器VideoBroadCaster

switch和toggle在软件开发中的含义和区别

switch和toggle这一对表示“切换”的单词&#xff0c;在计算机软件中我们能经常看到&#xff0c;很多时候口语中也会经常提及。但是&#xff0c;你想过它们之间有什么区别吗&#xff1f;没有区别&#xff1f;那你就大错特错了&#xff0c;区别还是很明显的&#xff0c;呵呵。 …

ios wkweb设置图片_iOS wkwebview和 uiwebview 内容图片自适应大小

- (void)webViewDidFinishLoad:(UIWebView *)webView {// 2、都有效果NSString *js"var script document.createElement(script);""script.type text/javascript;""script.text \"function ResizeImages() { ""var myimg,oldwidth;…

activiti异步执行_对基于消息队列的Activiti异步执行器进行基准测试

activiti异步执行一点历史 永无休止的一件事是&#xff0c;Activiti在某些非常大的规模的大型组织中的使用方式。 过去&#xff0c;这导致了各种优化和重构&#xff0c;其中包括异步执行器-替换旧的作业执行器。 对于未启动的用户&#xff1a;这些执行器在流程实例中处理计时器…

C++ 11 深度学习(十六)单例设计模式共享数据分析、解决,call_once

call_once std::call_once(参数一&#xff0c;参数二&#xff08;函数接口))的功能是保证一个函数只被调用一次&#xff0c;此方法具有互斥量的能力&#xff0c;并且消耗比互斥量少。此函数需要与标记std::once_flag配合使用&#xff0c;通过该标记决定函数是否调用&#xff0…

chrome浏览器设置网页快速到顶部和到底部的方法

鼠标移到浏览器的书签任意位置&#xff0c;点击鼠标右键添加书签&#xff0c;在添加书签的窗口输入名称和js代码&#xff0c;然后把书签移到浏览器书签栏的最左侧&#xff0c;这样每次浏览网页就可以使用快捷方式快速到底部或者顶部了。 快速到顶部的js代码&#xff1a;javascr…

ebp 函数堆栈esp_函数堆栈调用过程

从内存的角度详细的分析C语言中的函数调用过程&#xff1a;首先写一个测试用的代码&#xff1a;#include int add(int x, int y){int z 0;z x y;return z;}int main(){int a 1, b 2;int c 0;c add(a, b);return 0;}这是一个简单的的求和函数。其次&#xff0c;让我们确定…

apache pdfbox_Apache PDFBox命令行工具:无需Java编码

apache pdfbox在博客文章Apache PDFBox 2中 &#xff0c;我演示了将Apache PDFBox 2用作从Java代码中调用的库来操作PDF。 事实证明&#xff0c;Apache PDFBox 2还提供了可以直接从命令行直接使用的命令行工具 &#xff0c;而无需其他Java编码。 有几种命令行工具可用&#xff…

Java数组的学习

文章目录数组的声明和定义数组的特点如何使用数组数组的声明和定义 int[] ary new int[4] //动态初始化&#xff0c;长度4 int[] ary new int[]{1,2,3} //直接使用元素创建数组&#xff0c;也是动态初始化 int[] ary {1,2,3} //静态初始化// 数组变量的声明 int[] ary; in…