处理 Exception 的实践方法
-
在 Java 中处理异常并不是一个简单的事情。
在 Finally 块中清理资源或者使用 try-with-resource 语句:当使用类似 InputStream 这种需要使用后关闭的资源时,一个常见的错误就是在 try 块的最后关闭资源。
指定具体的异常:尽可能的使用最具体的异常来声明方法,这样才能使得代码更容易理解。
对异常进行文档说明:当在方法上声明抛出异常时,也需要进行文档说明。和前面的一点一样,都是为了给调用者提供尽可能多的信息,从而可以更好地避免 / 处理异常。异常处理的 10 个最佳实践,这篇也推荐看下。
抛出异常的时候包含描述信息:在抛出异常时,需要尽可能精确地描述问题和相关信息,这样无论是打印到日志中还是监控工具中,都能够更容易被人阅读,从而可以更好地定位具体错误信息、错误的严重程度等。
首先捕获最具体的异常:现在很多 IDE 都能智能提示这个最佳实践,当你试图首先捕获最笼统的异常时,会提示不能达到的代码。当有多个 catch 块中,按照捕获顺序只有第一个匹配到的 catch 块才能执行。因此,如果先捕获IllegalArgumentException,那么则无法运行到对 NumberFormatException 的捕获。
不要捕获 Throwable:Throwable 是所有异常和错误的父类。你可以在 catch 语句中捕获,但是永远不要这么做。如果 catch 了 throwable,那么不仅仅会捕获所有 exception,还会捕获 error。而 error 是表明无法恢复的 jvm 错误。因此除非绝对肯定能够处理或者被要求处理 error,不要捕获 throwable。
包装异常时不要抛弃原始的异常:捕获标准异常并包装为自定义异常是一个很常见的做法。这样可以添加更为具体的异常信息并能够做针对的异常处理。需要注意的是,包装异常时,一定要把原始的异常设置为 cause(Exception 有构造方法可以传入 cause)。否则,丢失了原始的异常信息会让错误的分析变得困难。
西南地区IT社群(QQ)
- 云南
- 【昆明网页设计交流吧】243627302
- 【昆明nodejs交流吧】 243626749
- 【VUE】838405306
- 【云南程序员总群】343606807
- 【昆明UI设计】104031254
- 【云南软件外包】15547313
- 贵州
- 【PHP/java源码/站长交流群】55692114
- 四川
- 【成都Java/JavaWeb交流】86669225
- 【vaScript+PHP+MySql】116270060
- 【UI设计/设计交流学习群】135794928
- 重庆
- 【诺基亚 JAVA游戏博物馆】 559479780
- 【PHP,Java,Python,C++接单】 442103442
- 西藏