JAVA异常处理的小建议
-
尽量不要使用e.printStackTrace(),而是使用log打印。printStackTrace()打印出的堆栈日志跟业务代码日志是交错混合在一起的,通常排查异常日志不太方便。而e.printStackTrace()语句产生的字符串记录的是堆栈信息,如果信息太长太多,字符串常量池所在的内存块没有空间了,即内存满了,那么,用户的请求就会卡住。
catch了异常,但是没有打印出具体的exception,无法更好定位问题。
不要用一个Exception捕捉所有可能的异常。这个在初学者时就会讲到,用一个Exception处理异常时会导致异常没有解决办法,从而抓不准异常的点。
记得使用finally关闭流资源或者直接使用try-with-resource。如果不使用finally或者try-with-resource,当程序发生异常,IO资源流没关闭,那么这个IO资源就会被他一直占着,这样别人就没有办法用了,这就造成资源浪费。
捕获异常与抛出异常必须是完全匹配,或者捕获异常是抛异常的父类。
捕获到的异常不能忽略,最起码要在日志中记录下来。虽然一个正常情况都不会发生的异常,但是如果你捕获到它,就不要忽略,一定要记得记录下来。
注意异常对你的代码层次结构的侵染。任何时候对于一个项目而言异常都是早发现早处理遗留的问题会最少。我们的项目,一般都会把代码分 Action、Service、Dao 等不同的层次结构,如果你是DAO层处理的异常,尽早处理吧,如果往上 throw SQLException,上层代码就还是要try catch处理啦,这就污染了你的代码。
包装异常时不要抛弃原始的异常。捕获标准异常并包装为自定义异常是一个很常见的做法。这样可以添加更为具体的异常信息并能够做针对的异常处理。需要注意的是,包装异常时,一定要把原始的异常设置为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
- 西藏