Exception 和Error 都是继承 Throwable 类,在 java 只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。Exception 和 Error 提现了 Java 平台设计者不同异常情况的类,Exception 在程序运行中,可预料的意外情况,并且可能被捕获,进行相应处理。
image
try {
// 业务代码
// …
Thread.sleep(1000L);
} catch (Exception e) {
// Ignore it
}
上面的代码有什么问题?
根据异常处理的基本原则,不要使用 Exception 这样的通用异常,需要捕获特点异常,上面的代码 Thread.sleep 会抛出 InterruptedException 应该捕获这个异常,软件工程师需要协作的,程序员有义务让代码能够直观体现出更多的信息。
其次不要生吞了异常,不能 ingonore ,当不需要抛出异常时,需要打印出相关异常信息。否则程序很可能以不可控的方式结束,不能够判断是哪里出现了异常。
try {
// 业务代码
// …
} catch (IOException e) {
e.printStackTrace();
}
“ Prints this throwable and its backtrace to the standard error stream ” 上面的代码可能出现的问题时,当系统复杂是,无法找到堆栈轨迹,不知道日志输出到哪了。
public void readPreferences(String fleName){
//...perform operations...
InputStream in = new FileInputStream(fleName);
//...read the preferences fle...
}
比如说当从输入参数 filename 为null 时,程序就会抛出 NullPointerException ,但是由于没有爆出这个问题,堆栈信息可能让人费解,要做到的是就是在发现问题的时候,第一时间抛出,能够更清晰的反应问题。这个就是 throw early。这样,根据 throw early 就可以将代码改造如下:
public void readPreferences(String flename) {
Objects. requireNonNull(flename);
//...perform other operations...
InputStream in = new FileInputStream(flename);
//...read the preferences fle...
}
catch late
捕获异常后,要怎么处理,要么生吞异常。要么可以选择保留异常的cause 信息,直接再抛出去或者创建新的异常,抛出去,这样更高层面,往往可以更清楚处理方式是什么。
参考资料