博客
关于我
[整理] 处理Java异常的10个最佳实践
阅读量:424 次
发布时间:2019-03-06

本文共 1912 字,大约阅读时间需要 6 分钟。

目录

1. 线上代码不要使用printStackTrace()

写完代码后请一定要检查下,代码中千万不要有printStackTrace()。因为printStackTrace()只会在控制台上输出错误的堆栈信息,他只适合于用来代码调试。

真正需要记录异常,请使用日志记录。

2. 永远不要在catch块中吞掉异常

catch (NoSuchMethodException e) {     return null;}

永远不要不处理异常,并返回null,这样异常就会被吞掉,无法获取到任何失败信息,会给日后的问题排查带来巨大困难。

3. 在需要的地方声明特定的受检异常

public void foo() throws Exception { //错误做法}

一定要尽量避免上面的代码,因为他的调用者完全不知道错误的原因到底是什么。

在方法声明中,可以由方法抛出一些特定受检异常。如果有多个,那就分别抛出多个,这样这个方法的使用者才会分别针对每个异常做特定的处理,从而避免发生故障。

public void foo() throws SpecificException1, SpecificException2 { //正确做法}

4. 始终只捕获那些可以处理的异常

catch (NoSuchMethodException e) {    throw e; //这代码一点用都没有}

这是一个基本概念,当你能够处理他时,你再捕获这个异常,否则永远都不要捕获他。

如果你不能在catch块中处理它,那么就不要先捕获再直接抛出,这样没有任何意义。

5. 尽量捕获特定的子类,而不是直接捕获Exception类

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

以上代码,最大的问题就是,如果someMethod()的开发者在里面新增了一个特定的异常,并且预期是调用方能够特殊的对他进行处理。

但是调用者直接catch了Exception类,就会导致永远无法知道someMethod的具体变化细节。这久可能导致在运行的过程中在某一个时间点程序崩溃。

6. 永远不要捕获Throwable类

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

7. 始终在自定义异常中覆盖原有的异常,这样堆栈跟踪就不会丢失

catch (NoSuchMethodException e) {  throw new MyServiceException("Some information: " + e.getMessage());  //错误做法}

上面的命令可能会丢失掉主异常的堆栈跟踪。正确的方法是:

catch (NoSuchMethodException e) {     throw new MyServiceException("Some information: " , e);  //正确做法}

8. 可以记录异常或抛出异常,但不要同时做

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

如上面的代码所示,抛出和日志记录可能会在日志文件中产生多个日志消息。

这就会导致同一个问题,却在日志中有很多不同的错误信息,使得开发人员陷入混乱。

9. 永远不要在finally中抛出异常

try {  someMethod();  //抛出 exceptionOne}finally{  cleanUp();    //如果在这里再抛出一个异常,那么try中的exceptionOne将会丢失forever}

在上面的例子中,如果someMethod()抛出一个异常,并且在finally块中,cleanUp()也抛出一个异常,那么初始的exceptionOne(正确的错误异常)将永远丢失。

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

try {  someMethod(); } finally{  cleanUp();    }

这也是一个很好的实践。如果在你的方法中访问其他方法,而该方法抛出了异常你不想处理,但是仍然需要做一些清理工作,那么在finally块中进行清理。不要使用catch块。

转载地址:http://mhcuz.baihongyu.com/

你可能感兴趣的文章
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
MFC模态对话框和非模态对话框
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>