目录
- 1.尽量使用log打印
- 2.没有打印出具体的Exception,无法更好定位问题
- 3.不要用一个Exception捕捉所有可能的异常
- 4.使用finally关闭流资源或者直接使用try-with-resource
- 5.捕获异常与抛出异常必须是完全匹配,或者捕获异常是抛异常的父类
- 6.捕获到的异常,至少打点日志
- 7.注意异常对你的代码层次结构的侵染(早发现早处理)
- 8.自定义封装异常,不要丢弃原始异常的信息Throwable cause
- 9.运行时异常RuntimeException ,不应该通过catch 的方式来处理,而是先预检查,比如:NullPointerException处理
- 10.注意异常匹配的顺序,优先捕获具体的异常
1.尽量使用log打印
printStackTrace()打印的堆栈信息和业务代码是混合在一起的,排查起来不太方便
e.printStackTrace()会产生字符串,占用字符串常量池空间
2.没有打印出具体的Exception,无法更好定位问题
log.info(“程序出现异常”,e);
打印异常信息有利于排查问题
3.不要用一个Exception捕捉所有可能的异常
如果用基类 Exception 捕捉多个可能的异常,会丢失原始异常的有效信息
try{
// IOException 的代码调用
// SQLException 的代码调用
}catch(IOException e){
log.info(“IOException:”, e);
}catch(SQLException e){
log.info(“SQLException:”, e);
}
4.使用finally关闭流资源或者直接使用try-with-resource
如果程序发生异常,资源流未关闭,就会被一直占用,造成资源浪费
JDK7的新特性try-with-resource来处理,用于自动资源管理。
—资源是指在程序用完了之后必须要关闭的对象。
—try-with-resources保证了每个声明了的资源在语句结束的时候会被关闭
—只要实现了java.lang.AutoCloseable接口或者java.io.Closeable接口的对象,都可以视为资源。
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("test.txt"));
} catch (FileNotFoundException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}finally {
try {
if (fis != null) {
fis .close();
}
} catch (IOException e) {
log.error(e);
}
}
try (FileInputStream inputStream = new FileInputStream(new File("test.txt")) {
//-----------------------
} catch (FileNotFoundException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}
5.捕获异常与抛出异常必须是完全匹配,或者捕获异常是抛异常的父类
//抛出Exception的子类
public static void test() throws BizException {}
try {
test();
} catch (Exception e) {
log.error(e);
}
6.捕获到的异常,至少打点日志
7.注意异常对你的代码层次结构的侵染(早发现早处理)
我们的项目一般分为不同的层次结构,如果是SQL异常,尽早处理吧,如果往上 throw SQLException,上层代码还是要try catch处理,可能会与业务逻辑混杂在一起,这就污染了你的代码
8.自定义封装异常,不要丢弃原始异常的信息Throwable cause
catch (FileNotFoundException e) {
//e 保存异常信息
throw new MyException(“文件在哪里呢”, e);
}
9.运行时异常RuntimeException ,不应该通过catch 的方式来处理,而是先预检查,比如:NullPointerException处理
if (object != null){
…
}
10.注意异常匹配的顺序,优先捕获具体的异常
只有第一个匹配到异常的catch块才会被执行。如果你希望看到,是NumberFormatException异常,就抛出NumberFormatException,如果是IllegalArgumentException就抛出IllegalArgumentException。
把优先需要匹配的异常置于最前
try {
//-----------------------
} catch (NumberFormatException e) {
log.error(e);
} catch (IllegalArgumentException e) {
log.error(e);
}