(一)異常機制出現的原因
異常處理能提升程序的健壯性,C語言中是通過函數返回值來處理異常的,這種做法的弊端:
1.返回值與現有邏輯可能衝突。
2.代碼可讀性差。執行代碼和異常處理代碼混淆在一起。
3.需瞭解函數返回值詳細信息,以做處理。
/**
* 異常處理demo
*
* @author peter_wang
* @create-time 2014-9-24 上午9:24:35
*/
public class ExceptionDemo {
/**
* @param args
*/
public static void main(String[] args) {
int num = operateNum(5);
// 函數外部使用者需知道異常返回值
// 函數計算結果剛好爲-1,本質上不屬於異常範圍
// 異常處理加重程序耦合性,異常處理和正常處理混淆在一起
if (num == -1) {
System.out.println("傳入參數不正確");
}
else {
System.out.println("計算結果:" + num);
}
}
private static int operateNum(int num) {
if (num == 0) {
return -1;
}
num = 10 / num;
num -= 3;
return num;
}
}
(二)異常分類
系統級錯誤(error):如內存消耗完,通常情況下不需要理會。
編譯時錯誤:這種異常必須在代碼裏被顯示的捕獲語句包住,否則編譯不過,如FileNotFoundException。
運行時錯誤:代碼不規範產生的錯誤,出現錯誤需要程序員更改bug,如空指針異常和數組下標越界。
(三)異常的使用
1.不要忽略異常
try {
......
}
catch (Exception e) {
}
不處理異常,違背了異常設計的初衷,程序出錯難以找到錯誤原因。
2.不要把邏輯性較強的代碼分離
FileInputStream is = null;
try {
is = new FileInputStream(new File(""));
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
is.read();
}
catch (IOException e) {
e.printStackTrace();
}
異常捕捉分離了邏輯較強的代碼,可讀性變差。應採用如下代碼
FileInputStream is = null;
try {
is = new FileInputStream(new File(""));
is.read();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
3.能處理的異常不向上傳遞
對異常的處理有兩種方式:自己處理catch和向上傳遞throw。
向上傳遞代表了太多未知,能處理的自己處理,除非事先知道該信息需要上層處理才傳遞。
4.IO異常處理
如果使用了一些資源例如數據庫連接或者網絡連接,記住在finally中做一些清理工作(如關閉數據庫連接或者網絡連接)。
5.不要全部用Exception來捕捉異常
細化異常類型,能有利於處理和錯誤信息捕捉。