java try catch陷阱_Java异常处理最佳实践及陷阱防范

原标题:Java异常处理最佳实践及陷阱防范

33c7525e67eba7bff5a95e62f00f6042.png

出自《深夜里的程序猿》

作者:wangzenghuang

前言

不管在我们的工作还是生活中,总会出现各种“错误”,各种突发的“异常”。无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时,往往还会导致其他新的问题出现。所以我们要时刻注意这些陷阱以及需要一套“最佳实践”来建立起一个完善的异常处理机制。

正文

异常分类

760dacce22d213f6fbfd265adddf5e76.png

首先,这里我画了一个异常分类的结构图。

在JDK中,Throwable是所有异常的父类,其下分为”Error“和”Exception“。Error意味着出现了不可控的严重错误,例如OutOfMemoryError。Exception则细分为两类,受检异常(check)需要我们手动try/catch或者在方法定义中throws,编译器在编译的时候会检查其合法性。非受检异常(uncheck)则不需要我们提前处理。这些简单的概念对于开发人员来说都是必须掌握的,这里就展示个图例,不做详细的描述了,我们的”正餐“还在后面。

重新认识try/catch/finally

说到异常处理,这里就不得不提try/catch/finally。try不可以单独存在,要么搭配catch,要么搭配finally,或者三者并存。

1、try代码块:监视代码块的执行,发现对应的的异常则跳转至catch,若无catch则直接到finally块。

2、catch代码块:发生对应的异常会执行里面的代码,要么处理,要么向上抛出。

3、finally代码块:不管是否有异常,都必执行,一般用来清理资源,释放连接等。然而有以下几种情况不会执行到这里的代码。

代码执行流程未进入try代码块。

代码在try代码块中发生死循环、死锁等状态。

在try代码块中执行了System.exit()操作。

try/catch/finally陷阱

下面介绍两个我们在使用tcf的时候可能会遇到的陷阱。

代码1

public class TCFDemo {

public static void main(String[] args) {

//11

System.out.println(returnVal());

}

static int returnVal(){

int a = 1;

int b = 10;

try{

return ++a;

}finally {

return ++b;

}

}

}

陷阱1:在finally中添加return语句,这样会覆盖掉try代码return的值,假如业务逻辑比较复杂,这里是很容易掉坑的,不利于排查错误。

代码2

public class TCFDemo {

public static void main(String[] args) {

Lock lock = new ReentrantLock();

try{

//有可能加锁失败

lock.lock();

//dost

}finally {

lock.unlock();

}

}

}

陷阱2:由于lock方法在加锁的时候有可能会抛出Uncheck异常,如果在try代码块中,必然会执行unlock方法,此时由于并没有加锁成功,所以会抛出IllegalMonitorStateException,这样一来后者的异常就覆盖掉了前者加锁失败的异常信息,所以我们应该把加锁的方法挪至try代码块外面。

最佳实践

好了,前面简单介绍了异常的分类以及try/catch/finally的注意事项,现在可以总结一下我们在异常处理的时候有哪些”最佳实践“了。

当需要向上抛出异常的时候,需根据当前业务场景定义具有业务含义的异常,优先使用行业内定义的异常或者团队内部定义好的。例如在使用dubbo进行远程服务调用超时的时候会抛出DubboTimeoutException,而不是直接把RuntimeException抛出。

请勿在finally代码块中使用return语句,避免返回值的判断变得复杂。

捕获异常具体的子类,而不是Exception,更不是throwable。这样会捕获所有的错误,包括JVM抛出的无法处理的严重错误。

切记更别忽视任何一个异常(catch住了不做任何处理),即使现在能确保不影响逻辑的正常运行,但是对于将来谁都无法保证代码会如何改动,别给自己挖坑。

不要使用异常当作控制流程来使用,这是一个很奇葩也很影响性能的做法。

清理资源,释放连接等操作一定要放在finally代码块中,防止内存泄漏,如果finally块处理的逻辑比较多且模块化,我们可以封装成工具方法调用,代码会比较简洁。

结尾

小小的异常,有大大的学问,你觉得呢?返回搜狐,查看更多

责任编辑:

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

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

相关文章

vivo手机怎么投屏到电脑_投屏软件电脑加手机投屏软件投屏

优秀的资源工具可以让你事半功倍!本号文内资源已经手工转存整理,安全起见,回复 “领取资源” 按提示自助领取。今天分享的是一家公司出品的投屏神器。为避免被举报这里就不说出软件名了。它可以在局域网内把手机的屏幕投到电脑上,…

How to upload windows Sysprep Files to VMware vCenter Server Appliance 6.5(vC

vCSA5.5中可以登录到端口5480中去上传,vCSA 6.0以后就不支持了。但是可以通过Enable “Pi Shell”来做。 首先确保vCSA的ssh可用: 0. Make sure that SSH in enabled on the VCSA. Home > Administration > System configuration (under Deploymen…

Vivado Design Suite用户指南之约束的使用第二部分(约束方法论)

Constraints Methodology(约束方法论) 关于约束方法论 设计约束定义了编译流程必须满足的要求,以使设计在板上起作用。 并非所有步骤都使用所有约束在编译流程中。 例如,物理约束仅在实现步骤期间使用(即,由…

eval函数 php_PHP的一句话木马代码和函数eval的简介

大清早的刚从床上爬起来。雨落就跑来找我问我这段代码是什么意思<?php eval($_POST[pp]);?>看了一下&#xff0c;post接收pp的值&#xff0c;抑制错误输出。呵呵开个玩笑&#xff0c;其实不是这么简单&#xff0c;这是一段PHP木马代码&#xff0c;也就是我们所说的后门…

linux安装python_Python - 爱豆

Python下载Python最新源码&#xff0c;二进制文档&#xff0c;新闻资讯等可以在Python的官网查看到&#xff1a;Python官网&#xff1a;你可以在以下链接中下载 Python 的文档&#xff0c;你可以下载 HTML、PDF 和 PostScript 等格式的文档。Python文档下载地址&#xff1a;doc…

ppt复制切片器_零基础小白自学PPT快速入门到精通(上)

零基础小白如何自学PPT快速入门到精通呢&#xff1f;40个保姆级小技巧助力你高效掌握PPT基础操作&#xff01;PPT在学习与工作中的应用越来越广泛&#xff1a;在学校时免不了要做毕业答辩、毕业论文&#xff0c;工作中时常要进行复盘总结、工作汇报、推广方案&#xff0c;有时甚…

网络安全初创公司SafeBreach获1500万美元A轮融资

今天&#xff0c;网络安全初创公司 SafeBreach 宣布完成1500 万美元 A 轮融资&#xff0c;新投资者德国电信、惠普公司、 Maverick Ventures 及现有投资者 Sequoia Capital 和 Shlomo Kramer 参投。公司计划利用本轮融资加大研发力度&#xff0c;扩大销售及营销团队&#xff0c…

了解Linux操作系统发展阶段

一、硬件与软件发展历史 计算机由硬件和软件组成结构 二、Linux的发展史 Linux 操作系统是Unix操作系统的一种克隆系统。它诞生于1991年的10月5日&#xff08;只是第一次正式向外公布的时间&#xff09;。以后借助于Internet网络&#xff0c;并经过全世界各地计算机爱好者的共同…

c gui qt 4编程第二版_面试官问Linux下如何编译C程序,如何回答?为你编译演示

文章来源&#xff1a;嵌入式大杂烩 作者&#xff1a;ZhengNLWindows下常用IDE来编译&#xff0c;Linux下直接使用gcc来编译&#xff0c;编译过程是Linux嵌入式编程的基础&#xff0c;也是嵌入式高频基础面试问题。一、命令行编译及各个细分编译过程hello.c示例代码&#xff1a;…

css text-align-last设置末尾文本对齐方式

text-align-last&#xff1a;auto | start | end | left | right | center | justify auto&#xff1a; 无特殊对齐方式。 left&#xff1a; 内容左对齐。 center&#xff1a; 内容居中对齐。 right&#xff1a; 内容右对齐。 justify&#xff1a; 内容两端对齐。 start&#x…

secoclient隧道保活超时或协商超时_推荐:承德市隧道led大屏厂家电话【联丰智慧科技】...

通过为大型隧道施工建设搭建全覆盖式的定位&#xff0c;可以有效施工的效率、项目现场的保障能力。安装隧道门禁能解决哪些问题&#xff1f;近年来&#xff0c;我国交通建设正处于高速发展的阶段&#xff0c;在交通建设中&#xff0c;工程安防工作也越发受到&#xff0c;越来越…

作业,两次实验

实验一&#xff1a; 1 编程打印5行的倒三角形&#xff0c;第一行打印9个*&#xff0c;第二行7个*&#xff0c;……第5行打印1个* #include<stdio.h>int main(){printf("*********\n *******\n *****\n ***\n *\n");return 0;} 总结 注意换行以及位置的…

javaweb和ajax使用查询出来的数据做下拉菜单_区块链浏览器实用指南篇:利用链上数据把握减半行情...

进入2020年&#xff0c;加密货币市场最热的话题当属“减半”了。在减半行情的推动下&#xff0c;以BTC为首的减半币种展现出了极强的上行趋势。如何抓住这一波行情&#xff0c;评估正确时机&#xff1f;当然&#xff0c;这个问题的答案可以说是争议纷纷&#xff0c;但有一个参考…

电脑删除快捷键_可能是知乎最有用的 Windows 快捷键学习指南。

在任何地方搜索“快捷键的使用”&#xff0c;你都能找到无数的列表清单。但你应该不会专门去对照一个个的表单&#xff0c;企图把所有快捷键全部掌握吧&#xff1f;经过三年左右的总结和视频制作&#xff0c;Topbook 大概产出了 20 支左右的快捷键、快捷操作及应用等相关的视频…

算法专题 普及组【2008】三3 C++版

转载于:https://www.cnblogs.com/qilinart/articles/5914850.html

【覆盖安装】通用测试点

需要xmind文档请留言将会私发。 转载于:https://www.cnblogs.com/syw20170419/p/10457600.html

菜鸟裹裹电脑版_【绵阳最新转让】3500低价出售家用制氧机!东芝i5笔记本电脑、索尼微单相机、联想笔记本电脑、奶茶店、服装店转让......

转换价值&#xff0c;传承梦想西蜀网让你淘好物~3500出售鱼跃家用制氧机&#xff0c;带雾化全新鱼跃152021/9F_5W型家用制氧机&#xff0c;带雾化。正规医疗器械公司买的&#xff0c;有小票&#xff0c;买到只用了一次&#xff0c;买成4382现低价转让。联系电话&#xff1a;邓女…

Linux环境中配置环境变量无效

1.在Linux系统中的【 ~/.baserc 】文件与【 /etc/profile 】配置环境变量后(可以使任意环境变量)无效的现象&#xff0c;如下为解决办法&#xff1a; 使用命令&#xff1a; 1 vim ~/.zshrc 在 【# User configuration】下添加环境变量&#xff1b; 如图说明&#xff1a; 2.也可…

手机能打开的表白代码_手机拍照还能加文字?打开这个自带按钮,一键就能添加方便...

手机拍照还能文字&#xff1f;打开这个自带按钮&#xff0c;一键就能添加方便我们日常生活中&#xff0c;经常会在朋友圈里面看到&#xff0c;这样的图片&#xff0c;不仅图片好看&#xff0c;上面还带有精美的文字&#xff0c;里面还添加了时间、地点、天气&#xff0c;在配上…

Spring Cloud Eureka 入门 (二)服务提供者详解

2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载&#xff0c;保留摘要&#xff0c;谢谢&#xff01; “优秀不是过去是一种心态” 「Spring Cloud Eureka 入门系列」Spring Cloud Eureka 入门 &#xff08;一…