文档章节

Java异常处理的最佳实践

北有风雪
 北有风雪
发布于 2017/02/16 13:54
字数 1128
阅读 6
收藏 0

Java异常处理的最佳实践

为什么要有最佳实践

我们在写程序是不可避免的要对代码进行异常处理,但是有时对异常的处理会使我们的程序变的更加糟糕,这是我们所不想看到的。所以,我们再进行异常处理时需要遵循一定的套路,来降低异常处理对我们程序的影响。

异常产生的原因

一般来说,java中的异常会产生于一下三种情况:

  1. 编程错误导致的异常,例如NullPointerException 和 IllegalArgumentException。这类的异常一旦发现,必须通过修改代码来解决。
  2. 资源错误导致的异常,例如网络资源socket、文件资源等。这类的异常出现时往往会以记录日志,挂起程序或者进行重试来作为解决方法。
  3. 输入数据导致的异常,例如输入的JSON数据与程序中所指定的规范不一致,由此产生数据无法正常解析所抛的异常。这类的异常发生时,需要逐步调试程序或输入的数据。

Java异常的分类

java中定义了两种异常:

  • Checked Exception:该类异常直接继承自Exception类。在调用抛出checked exception的API时,必须使用catch进行异常处理或者将该异常throw出去,否则代码不能通过编译。
  • Unchecked Exception:该类异常继承自Runtime Exception,Runtime Exception也继承自Exception类,该类异常不需要显式的进行处理就可以进行编译。

进行异常处理的最佳实践

异常选择

对于程序可以进行处理的异常,一般选择通过Checked Exception进行抛出,程序在catch住一个异常之后,可以选择记录日志或者恢复数据或者进行别的操作。
对于程序无法处理的异常,一般抛出Unchecked Exception,将异常抛往更高层的逻辑进行处理,当然Unchecked Exception也是可以进行catch的,当所有的代码均没有对该异常进行处理时,该异常会被交给应用容器进行处理。

在异常处理中释放资源

在各种IO中,一般都会有异常处理,再进行Checked Exception处理时一般在finally中关闭资源。

SQLException一般会被转换成Unchecked Exception

数据库异常一般来说都是连接断掉或者是没有权限等问题,这些在代码里面没法进行处理,因此应该抛出Unchecked Exception。对于某些数据库异常,我们虽然无法解决根本问题,但是仍然是需要进行处理的,比如插入数据是失败,我们应该在代码中捕获该异常,并将原始数据记录下来。

不要使用异常作流程控制

生成栈回溯是非常昂贵的,栈回溯的价值是在于调试。在流程控制中,栈回溯是应该避免的,因为客户端仅仅想知道如何继续。

使用异常进行业务数据校验

对于需要用户输入有要对其进行业务性校验的需求,可以在业务校验失败时抛出自定义异常来告知失败的原因。
例如:在登陆功能中,如果身份校验失败,可以抛出相应的异常到控制器,然后有控制器进行数据输出。

不要忽略异常

针对大多数异常来说,不要使用空的catch块来处理异常。

尽量不要捕捉高级别的异常

高级别的异常会将低级的异常信息吃掉,因此再进行处理时应该尽量捕捉具体的异常类型。
比如,使用Exception作为catch的对象就是一个极端的例子,任何情况下都不要catch Exception这个类,因为这样做毫无意义。

只处理一次

我看到过有人在写代码时catch到了一个异常,然后logger.error(e)进行处理,然后又把这个异常throw出去了,这会导致该异常被处理多次,给拍错人为的增加难度,既然决定将异常抛出就不要进行日志的输出了,但是如果想保存当前变量的状态仍然是可以的,不过这样做,throw这个异常就显得意义不大了。

© 著作权归作者所有

共有 人打赏支持
北有风雪
粉丝 2
博文 33
码字总数 55091
作品 1
程序员
Java异常处理 10 个最佳实践

异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了几个异常处理特性,以try,catch...

Java技术栈
08/27
0
0
Java自定义Exception

这里总结一下Java的Exception,并实现一个自定义Exception类。 总结: Throwable对象分为两种类型:Error(表示编译时和系统错误);Exception(在Java类库、用户方法以及运行时故障中抛出的异常...

Triangle23
2014/12/02
0
1
避免 Java 应用中 NullPointerException 的技巧和最佳实践

Java应用中抛出空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。熟话说“预防胜于治疗”,对于这么令人讨厌的空指针异常,这句话也是成立的。值得庆幸的是运用一些防...

大数据之路
2013/11/29
0
1
Spring JDBC最佳实践(1)

Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。 基于Tem...

zuoer
2012/01/04
0
2
Java虚拟机内存管理(一)—内存划分

Java 与 C++ 之间有一堵由内存动态分配和垃圾收集技术所围成的 “高墙”,墙外面的人想进去,墙里面的人却想出来。——《深入理解Java虚拟机:JVM高级特性与最佳时实践(第二版)》周志明 Ja...

Wizey
08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
10
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
20
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部