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

出自《深夜里的程序猿》

作者:wangzenghuang

前言

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

正文

异常分类

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

在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块处理的逻辑比较多且模块化,我们可以封装成工具方法调用,代码会比较简洁。

结尾

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

责任编辑:

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

  1. 手动抛出异常_Java异常处理最佳实践及陷阱防范

    前言 不管在我们的工作还是生活中,总会出现各种"错误",各种突发的"异常".无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时 ...

  2. Java异常处理最佳实践及陷阱防范

    前言 不管在我们的工作还是生活中,总会出现各种"错误",各种突发的"异常".无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时 ...

  3. java try catch 例子_Java异常处理综合例子(try、catch、finally、throws、throw)

    Java异常处理综合例子(try.catch.finally.throws.throw) 佟强 2009年11月4日 http://blog.csdn.net/microtong package cn ...

  4. java 批量处理 示例_Java异常处理教程(包含示例和最佳实践)

    java 批量处理 示例 异常是可能在程序执行期间发生的错误事件,它会破坏其正常流程. Java提供了一种健壮且面向对象的方式来处理异常情况,称为Java异常处理 . 我们将在本教程中研究以下主题. ...

  5. Java异常处理最佳实践

    在 Java 中处理异常并不是一个简单的事情.不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样处理等等.这也是绝大多数开发团队都会制定一些规 ...

  6. Java 处理 Exception 的 9 个最佳实践!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 在Java中处理异常并不是一个简单的事情.不仅仅初学者很难理解,即 ...

  7. Java Web应用的代码分层最佳实践

    转载自 Java Web应用的代码分层最佳实践 代码分层,对于任何一个Java Web开发来说应该都不陌生.一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加 ...

  8. 深入理解java虚拟机 -- jVM高级特性与最佳实践

    <深入理解 Java 虚拟机–JVM高级特性与最佳实践> 关于这本书已经断断续续的看了好几遍了,使自己对jvm有了很深的理解,但是由于长时间的不用,对很多的功能点有所遗忘,特此写下这篇随手 ...

  9. 《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    <深入理解Java虚拟机>阅读笔记 本repository为<深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)>阅读笔记,因为第一章主要讲的是Java的发展历史, ...

最新文章

  1. Python基础-安装
  2. MATLAB实战系列(十九)-遗传算法解决TSP(旅行商)问题-应用及解析(文末附MATLAB源码)
  3. 拉格朗日c语言实验报告,拉格朗日插值法C语言的实现(实验报告)(9页)-原创力文档...
  4. idea application context not configured for this file的问题的解决
  5. vim 正则非贪婪模式
  6. 海淀某互联网公司鼓励员工尽量住在公司
  7. KD_Tree 算法
  8. SpringBoot2.x整合Activiti7后,禁用SpringBootSecurity问题
  9. MssqlOnLinux 主从集群【2】
  10. python图片转视频加特效_使用Python opencv实现视频与图片的相互转换
  11. 成为黑客必须掌握的知识!
  12. 大数据抗疫的“洪荒之力”:多地政府借力大数据技术,多家企业上马大数据产品...
  13. 修改网站背景图html代码,网站首页顶部添加背景图片的修改代码
  14. bluetooth开发(五)------蓝牙的功能测试(一)
  15. 如果房贷被拒了怎么办?
  16. Caffe2自定义Operator
  17. 毕业之后所有面试总结
  18. 使用linux蓝牙指南
  19. mysql的树状表结构设计。
  20. kakaotalk登录显示无法连接服务器,KAKAOTALK登不上到底是什么问题?K – 手机爱问...

热门文章

  1. numpy统计分布显示
  2. Lambda表达式的前世今生
  3. cell 各自的高度不同的时候
  4. Gartner Q2服务器市场报告5大要点
  5. win2008修改远程端口
  6. 数据分析中的统计概率_了解统计和概率:成为专家数据科学家
  7. 数据可视化工具_数据可视化
  8. 数据挖掘流程_数据流挖掘
  9. 小程序 坚屏_如何构建坚如磐石的应用程序
  10. react实战课程_在使用React一年后,我学到的最重要的课程