处理Java异常的10种最佳实践

在本文中,我们将看到处理Java异常的最佳实践。 用Java处理异常不是一件容易的事,因为新手很难理解,甚至专家级开发人员也可能浪费时间讨论应该抛出或处理哪些Java异常。 因此,最大的开发公司对如何使用它们有一套规则。

如果您是公司的新手,那么Java异常处理中各种状态的呈现方式可能会让您感到震惊。 本文将向您展示最重要的十个方面,您可以用来入门或改善异常处理。 异常是程序执行期间的异常情况。 因此,让我们讨论处理Java异常的最佳实践。

1.处理Java异常的最佳实践

1.1永远不要在catch块中使用异常

catch (NoSuchMethodException e) {return null;
}

永远不要返回“ null”而不是处理异常,它会消耗异常并永久性地导致错误。 如果您不了解失败的原因,那么将来就无法阻止自己。

1.2声明您的方法可能抛出的特定检查异常

public void foo() throws Exception { //Incorrect way
}

始终尝试避免使用上面的代码,因为它可能完全出于拥有已检查异常的目的而造成缺陷。 必须声明该方法可能引发的特定检查异常。 如果用户有许多已检查的异常,则用户必须将其覆盖在用户的异常中,并将信息附加到异常消息中,否则用户也可以使用代码重构。

public void foo() throws SpecificException1, SpecificException2 { //Correct way
}

1.3不要获取异常类,而是捕获特定的子类

try {someMethod();
} 
catch (Exception e) 
{
LOGGER.error("method has failed", e);
}

获取异常的主要问题是,如果用户稍后调用的方法将新检查的异常附加到其设计签名中,则开发人员希望用户必须处理特定的新异常。 如果用户的代码出现异常,它将永远无法理解该变化。 用户的代码错误,并且可能在运行时的某个时间点崩溃。

1.4永远不要上任何Throwable类

这是一个严重的问题,因为Java错误也可以是Throwable的子类。 错误是不可更改的条件,无法由Java虚拟机本身控制。 Java虚拟机甚至可能不会在任何错误时请求用户的catch子句。

1.5始终准确地覆盖自定义异常中的异常,以免丢失堆栈跟踪

catch (NoSuchMethodException e) 
{
throw new MyServiceException("Some information: " + e.getMessage());  //Incorrect way
}

上面的命令可能会损坏主要异常的堆栈跟踪,并且总是错误的。 正确的方法是:

catch (NoSuchMethodException e) {throw new MyServiceException("Some information: " , e);  //Correct way
}

1.6记录或抛出异常,但不要同时执行

catch (NoSuchMethodException e) {LOGGER.error("Some information", e);throw e;
}

如上面的代码所示,抛出和记录可能会在日志文件中导致多个日志消息。 对于试图浏览各种日志的开发人员,代码中的单个问题可能会造成最坏的情况。

1.7永远不要从finally块抛出异常

try {someMethod();  //Throws exceptionOne
}finally 
{cleanUp();    //If finally also threw an exception the exceptionOne will be lost forever
}

准确地说,高达cleanUp()永远不会引发异常。 在上述情况下,如果someMethod()引发异常,并且在finally块中,cleanUp()引发异常,则该方法之外的其他异常将消失,原始的第一个异常(正确的原因)将永远消失。

1.8始终仅捕获那些可以处理的异常

catch (NoSuchMethodException e) 
{
throw e; //Avoid this as it doesn't help anything
}

这是一个必不可少的概念,从不捕获任何异常,因此仅在可以处理任何异常的情况下捕获任何异常,才能在该异常中提供其他上下文数据。 如果您不能在catch块中处理它,那么最好的建议是不要仅将其重新抛出就捕获它。

1.9不要使用printStackTrace()语句

完成代码后,切勿离开printStackTrace()。 很有可能是您的同事之一,他们最终将获得那些堆栈跟踪中的一个,并且对其处理方式的知识完全为零,因为它不会附加任何上下文信息。

1.10如果您不打算处理异常,请使用finally块而不是catch块

try {someMethod();  //Method 2
} 
finally 
{cleanUp();    //do cleanup here
}

这也是一个好习惯。 如果在方法内部访问某个方法2,并且方法2抛出一些您不想在方法1中处理的异常,但是仍然希望进行一些清除以防万一发生异常,那么请在finally块中进行此清除。 不要使用挡块。

正如我们已经讨论过的那样,java异常处理是必不可少的,有多种实践可以毫无问题地处理它们。 图片中出现的最新VPN应用漏洞是Google从其平台上删除了一些最佳VPN。 根据研究人员的说法,它具有支持中间人(MITM)攻击的危险漏洞,因此它仅允许黑客阻止提供者与用户之间的通信。 甚至将所有用户重定向到黑客的邪恶服务器,而不是真正的VPN服务器。 因此,谷歌删除了它们,以保护用户免受漏洞侵害。 Google确认这种类型的漏洞仍然存在,研究人员通过Google Play安全奖励计划(GPSRP)发布了结论。 GPSRP使安全分析人员可以发现安装次数超过1亿次的应用程序的漏洞。

2.结论

本文可帮助您获得有关处理Java异常的最佳实践的完整知识。 完全了解它是必不可少的,因为正如我们所讨论的,对于初学者和经验丰富的开发人员而言,这个主题都相当困难。

我们还讨论了google和顶级VPN应用之间的问题,即Google从其下载平台中删除了许多VPN,并提供了有关VPN应用漏洞问题的完整信息。

翻译自: https://www.javacodegeeks.com/10-best-practices-to-handle-java-exceptions.html

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

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

相关文章

markdown 流程图_Markdown 进阶技能:用代码画流程图(编程零基础也适用)

这篇文章主要介绍流程图基础以写代码的方式画流程图相比于使用画图工具拖拽画图,用代码画图有什么好处?首先,这种方式非常轻便,无需安装复杂的画图应用。Typora 等多种 Markdown 编辑器自带有画图扩展(这也是 Markdown…

java jtree_Java JTree

Java JTree1 Java JTree的介绍JTree类用于显示树结构数据或层次结构数据。JTree是一个复杂的组件。它的最顶部有一个“根节点”,它是树中所有节点的父节点。它继承了JComponent类。2 Java JTree的声明我们来看一下javax.swing.JTree类的声明。public class JTree ex…

akka和rabbitmq_Akka Notes –演员记录和测试

akka和rabbitmq在前两部分( 一 , 二 )中,我们简要讨论了Actor以及消息传递的工作方式。 在这一部分中,让我们看一下如何修复并记录我们的TeacherActor 。 回顾 这就是我们上一部分中的Actor的样子: class…

完数c++语言程序_C语言经典100题(19)

1上期答案揭晓首先给大家看看上一篇文章C语言经典100题(18)中第三部分编程题的答案:#includeint main(){ int s0,a,n,t; printf("请输入 a 和 n:\n"); scanf("%d%d",&a,&n); ta; while(n>0) { …

PHP怎样表示几时几分,PHP将时间戳转换为刚刚、N分钟前、今天几点几分、昨天几点几分......

自定义函数&#xff1a;<?php date_default_timezone_set(PRC); // 设置时区&#xff0c;如果已经设置可以删除function timeFormat( $timestamp ) {$curTime time();$space $curTime - $timestamp;if($space < 60) { // 一分钟以内$string "刚刚";return …

古巴:为生产做准备

“它可以在我的本地机器上运行&#xff01;” 如今&#xff0c;这听起来像模因&#xff0c;但仍然存在“开发环境与生产环境”的问题。 作为开发人员&#xff0c;您应始终牢记&#xff0c;您的应用程序有一天将在生产环境中开始运行。 在本文中&#xff0c;我们将讨论一些特定于…

php重载,PHP 重载

PHP 重载一个类中的方法与另一个方法同名&#xff0c;但是参数不同&#xff0c;这种方法称之为重载方法。很遗憾因为 PHP 是弱类型的语言&#xff0c; 所以在方法的参数中本身就可以接收不同类型的数据&#xff0c;又因为 PHP 的方法可以接收不定个数的参数&#xff0c;所以在 …

平板安装python_在CentOS上安装Python3的三种方法

Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装.注&#xff1a;本文示例安装版本为Python3.5&#xff0c;一、Python源代码编译安装安装必要工具 yum-utils &#xff0c;它的功能是管理repository及扩展包的工具 (主要是针对r…

hibernate脏数据_Hibernate脏检查的剖析

hibernate脏数据介绍 持久性上下文使实体状态转换入队 &#xff0c;该实体状态转换在刷新后转换为数据库语句。 对于托管实体&#xff0c;Hibernate可以代表我们自动检测传入的更改并安排SQL UPDATE。 这种机制称为自动脏检查 。 默认的脏检查策略 默认情况下&#xff0c;Hibe…

python查询sql_Python处理SQL语句(提供SQL查询平台使用)

在搞公司的SQL查询(MySQL)平台时&#xff0c;需要对用户查询SQL进行条数限制&#xff0c;默认是在配置文件中配置一个“limit 1000”这样的参数。最自然想到的就是对用户通过web传入的SQL做处理&#xff0c;默认加上limit参数。这样一来就有这么几个问题需要处理&#xff1a;1…

php组成,php接口有几部分组成?

程序接口&#xff0c;由一套陈述、功能、选项、其它表达程序结构的形式、以及程序师使用的程序或者程序语言提供的数据组成PHP接口(interface)的特点1、接口的方法必须是公开的。2、接口的方法默认是抽象的&#xff0c;所以不在方法名前面加abstract。3、接口可以定义常量&…

AWS Elasticsearch后模式

因此&#xff0c;碰巧我们在SaaS版本的LogSentinel上遇到了生产问题–我们的Elasticsearch停止了对新数据编制索引。 由于Elasticsearch只是辅助存储&#xff0c;因此没有数据丢失&#xff0c;但这给我们的客户带来了一些问题&#xff08;他们无法在其仪表板上看到实时数据&…

python设置word背景色_Python数据可视化:WordCloud入门

WordCloud是一种很好的展现数据的方式&#xff0c;网上也有不少小工具和在线网页。但是有些不支持中文&#xff0c;有些安装复杂&#xff0c;所以决定用Python实现。主要参考官网&#xff0c;通过官网的例子&#xff0c;讲一下WordCloud的制作。主要流程获取内容的路径如果是一…

java 解析日期格式_日期/时间格式/解析,Java 8样式

java 解析日期格式自Java 几乎 开始以来&#xff0c;Java开发人员就通过java.util.Date类&#xff08;自JDK 1.0起&#xff09;和java.util.Calendar类&#xff08;自JDK 1.1起 &#xff09;来处理日期和时间。 在这段时间内&#xff0c;成千上万&#xff08;甚至数百万&#x…

php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能

本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;最近用thinkPHP 5框架做了一个婚纱店的项目&#xff0c;在开发过程中需要用到第三方登录&#xff0c;腾讯官方给的案例是几个文件相互包含实现的&#xff0c;放到tp5…

mac 显示隐藏文件_如何在Mac上显示隐藏文件?苹果mac显示隐藏文件夹方法

与任何操作系统一样&#xff0c;macOS会将重要文件隐藏起来&#xff0c;以防止意外删除它们并因此而损坏系统。但是&#xff0c;在某些情况下&#xff0c;您可能需要在Mac上显示隐藏文件&#xff0c;例如&#xff0c;浏览“ 库”文件夹并清除旧日志&#xff0c;缓存或其他垃圾文…

分布式虚拟跟踪

跟踪提供了对系统的可见性&#xff0c;使开发人员和操作人员可以在运行时观察应用程序。 当系统不断增长并与更多微服务进行交互时&#xff0c;跟踪变得非常有价值。 在这样的环境中&#xff0c;这些痕迹非常棒&#xff0c;可以定位导致性能下降的故障和瓶颈。 在这篇文章中&a…

php 删除数组的空元素,php删除数组空元素的方法_后端开发

php如何实现自动跳转_后端开发php实现自动跳转的方法&#xff1a;1、通过php内置函数“header”&#xff0c;将http响应头中的“Location”设置为要跳转的URL即可&#xff1b;2、可以在javascript代码中将“window.location.href”指向要跳转的URL即可。php删除数组空元素的方法…

map for循环_JavaScript 用 for 循环太 low?你是不是有什么误解

天要吐槽下&#xff0c;我时不时地看到有些文章说“循环语句不好&#xff0c;你应该用 filter&#xff0c;map 和 reduce ”——每次看到有文章鼓吹&#xff0c;所有需要循环的场景一律用这几个函数式方法&#xff0c;我都恨得牙痒痒。没错&#xff0c;这些函数式方法确实有它们…

vue 动态组件组件复用_真正的动态声明性组件

vue 动态组件组件复用在这篇简短的文章中&#xff0c;我将重点介绍ADF动态声明性组件。 我的意思是一个众所周知的ADF标签af&#xff1a;declarativeComponent 。 它可以用作将页面设计为页面片段和组件组成的一种非常便捷的方法。 例如&#xff0c;我们的页面可以包含以下代码…