摘要: 简单实用的建议。

  • 原文:Java异常处理12条军规
  • 公众号:Spring源码解析

Fundebug经授权转载,版权归原作者所有。

在Java语言中,异常从使用方式上可以分为两大类:

  • CheckedException
  • UncheckedException

在Java中类的异常结构图如下:

  • 可检查异常需要在方法上声明,一般要求调用者必须感知异常可能发生,并且对可能发生的异常进行处理。可以理解成系统正常状态下很可能发生的情况,通常发生在通过网络调用外部系统或者使用文件系统时,在这种情况下,错误是可能恢复的,调用者可以根据异常做出必要的处理,例如重试或者资源清理等。

  • 非检查异常是不需要在throws子句中声明的异常。JVM根本不会强制您处理它们,因为它们主要是由于程序错误而在运行时生成的。它们扩展了RuntimeException。最常见的例子是NullPointerException 可能不应该重试未经检查的异常,并且正确的操作通常应该是什么都不做,并让它从您的方法和执行堆栈中出来。在高执行级别,应记录此类异常。

  • Error是最为严重的运行时错误,几乎是不可能恢复和处理,一些示例是OutOfMemoryError,LinkageError和StackOverflowError。它们通常会使程序或程序的一部分崩溃。只有良好的日志记录练习才能帮助您确定错误的确切原因.

在异常处理时的几点建议:

1. 永远不要catch中吞掉异常,否则在系统发生错误时,你永远不知道到底发生了什么

catch (SomeException e) {  return  null;
}
复制代码

2. 尽量使用特定的异常而不是一律使用Exception这样太泛泛的异常

public void foo() throws Exception { //错误的做法}
复制代码
public void foo() throws MyBusinessException1, MyBusinessException2 { //正确的做法}
复制代码

一味的使用Exception,这样就违背了可检查异常的设计初衷,因为调用都不知道Exception到底是什么,也不知道该如何处理。捕获异常时,也不要捕获范围太大,例如捕获Exception,相反,只捕获你能处理的异常,应该处理的异常。即然方法的声明者在方法上声明了不同类型的可检查异常,他是希望调用者区别对待不同异常的。

3. Never catch Throwable class

​永远不要捕获Throwable,因为Error也是继承自它,Error是Jvm都处理不了的错误,你能处理?所以基于有些Jvm在Error时就不会让你catch住。

4. 正确的封装和传递异常**

不要丢失异常栈,因为异常栈对于定位原始错误很关键

catch (SomeException e) {throw  new MyServiceException("Some information: " + e.getMessage());  //错误的做法}
复制代码

一定要保留原始的异常:

catch (SomeException e) {   throw new MyServiceException("Some information: " , e);  //正确的打开方式}
复制代码

5. 要打印异常,就不要抛出,不要两者都做

catch (SomeException e) {   LOGGER.error("Some information", e);throw e;
}
复制代码

这样的log没有任何意义,只会打印出一连串的error log,对于定位问题无济于事。

6. 不要在finally块中抛出异常

如果在finally中抛出异常,将会覆盖原始的异常,如果finally中真的可能会发生异常,那一定要处理并记录它,不要向上抛。

7. 不要使用printStackTrace

要给异常添加上有用的上下文信息,单纯的异常栈,没有太大意义

8. Throw early catch late

异常界著名的原则,错误发生时及早抛出,然后在获得所以全部信息时再捕获处理.也可以理解为在低层次抛出的异常,在足够高的抽象层面才能更好的理解异常,然后捕获处理。

9. 对于使用一些重量级资源的操作,发生异常时,一定记得清理

如网络连接,数据库操作等,可以用try finally来做clean up的工作。

10. 不要使用异常来控制程序逻辑流程

我们总是不经意间这么做了,这样使得代码变更丑陋,使得正常业务逻辑和错误处理混淆不清;而且也可能会带来性能问题,因为异常是个比较重的操作。

11. 及早校验用户的输入

在最边缘的入口校验用户的输入,这样使得我们不用再更底层逻辑中处处校验参数的合法性,能大大简化业务逻辑中不必要的异常处理逻辑;相反,在业务中不如果担心参数的合法性,则应该使用卫语句抛出运行时异常,一步步把对参数错误的处理推到系统的边缘,保持系统内部的清洁。

12. 在打印错误的log中尽量在一行中包含尽可能多的上下文

LOGGER.debug("enter A");LOGGER.debug("enter B"); //错误的方式
复制代码
LOGGER.debug("enter A, enter B");//正确的方式
复制代码

转载于:https://juejin.im/post/5cafebbbe51d456e3428c0c8

Java异常处理12条军规相关推荐

  1. 数人云|12条军规说Dev,3大重点讲Ops——当当网的云原生之路

    8月19日数人云Meetup上来自当当网的高洪涛老师做了<当当云原生DevOps实践>的主题分享,从应用改造入手,重点讲述了运维核心-监控的相关内容. 数人云提醒:8000字长文值得分享与 ...

  2. 架构之重构的12条军规

    2019独角兽企业重金招聘Python工程师标准>>> 注]架构之重构的12条军规(上)发布以后,一些读者着急要下篇,所以在这里我把上下篇合并成一篇,让大家可以阅读完整版,不用分开看 ...

  3. 架构之重构的 12 条军规

    [注]架构之重构的 12 条军规(上)发布以后,一些读者着急要下篇,所以在这里我把上下篇合并成一篇,让大家可以阅读完整版,不用分开看了. 对于开发者来说,架构设计是软件研发过程中最重要的一环,所谓没有 ...

  4. 架构之重构的12条军规!送给自己的礼物~

    对于开发者来说,架构设计是软件研发过程中最重要的一环,所谓没有图纸,就建不了房子.在遍地 App 的互联网时代,架构设计有了一些比较成熟的模式,开发者和架构师也可以经常借鉴. 但是,随着应用的不断发展 ...

  5. 睡个好觉的 12 条军规

    1.坚持睡眠时间表.每天在相同时间上床睡觉,在相同时间醒来.作为习惯的动物,人类很难适应睡眠模式的改变.周末多睡一会并不能完全弥补周中的睡眠不足,还往往会使周一早上更难起床.为就寝时间设置闹钟.我们几 ...

  6. java 12错误_Java异常处理的12条军规总结

    异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...

  7. DB2数据库安全的12条军规

    本文描述了用于 DB2 for Linux.UNIX 和 Windows 的十二种最佳安全实践.这些最佳实践专门注重于可以通过数据库管理和编程进行控制的一些元素,但是不包括其他可应用于系统中更大范围内 ...

  8. Java 异常处理的 9 个最佳实践

    Java 异常处理的 9 个最佳实践 原文地址:https://dzone.com/articles/9-... 翻译出处:https://www.oschina.net/trans... 在 Jav ...

  9. 深入理解java异常处理机制

    1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象 ...

最新文章

  1. 【第44题】【062题库】2019年OCP认证062考试新题
  2. php把表情去掉,php如何去除表情
  3. 全国计算机等级考试题库二级C操作题100套(第07套)
  4. Java如何隐藏控制按键动画_Java动画短片当不移动鼠标光标时
  5. 血雨腥风43载,苹果帝国背后的5个男人
  6. AndroidStudio_安卓原生开发_java.io.FileNotFoundException: http://172.19.128.5(拒绝访问)---Android原生开发工作笔记157
  7. 结构力学求解器_结构力学学好这些内容对施工很关键,你都学懂了吗?
  8. 逻辑回归案例模板——信用卡欺诈检测
  9. DevExpress 单元格的设置(可设字体、字号、前景色、背景色)
  10. 码农视角: iPhone XR升级到iOS 14.2之后引发的惨案
  11. 【excel】定位列内差异/定位行内容差异单元格
  12. DTOJ 1486:分数(score)
  13. antd vue table ellipsis属性不生效
  14. 虽然分模块了,但是 mapActions 写法,照样可用
  15. 3D mark 05 测试
  16. 春暖花开,想念面朝大海
  17. Keras深度学习实战(34)——构建聊天机器人
  18. 【问题解决】Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
  19. 学习Linux命令(8)
  20. [RK3288][Android6.0] WiFi之NetworkFactory形成的评分机制

热门文章

  1. 腾讯云与每日优鲜便利购战略签约 引领无人零售2.0时代发展
  2. Linux (CentOS 7 )下搭建局域网SVN服务器+SVN权限配置
  3. FTP匿名访问修复方法
  4. 闭关纪要17.Google app engine的简单应用
  5. 2018-2019-1 20165310 20165315 20165226 实验一 开发环境的熟悉
  6. MYSQL 查询数据排序数据和分组数据
  7. UCloud与NTT达成合作,提供可靠跨地域混合云服务
  8. iOS progressive Web App (PWA) 技术
  9. SQL2K数据库开发二之查看和修改Sample数据库
  10. linux tpm 测试完整记录,亲测有效。