在 java 里有 3 種異常類型 :
1.?????? 檢查型異常 , 這樣的異常繼承于 Excetpion, 就是在編譯期間需要檢查 , 如果該異常被 throw, 那么在該異常所在的 method 后必須顯示的 throws, 調(diào)用該 method 的地方也必須捕獲該異常 , 否則編譯器會(huì)拋出異常 .ejb 里的 RemoteException 是一個(gè)這樣的異常 .
2.?????? 運(yùn)行時(shí)異常 , 就是在運(yùn)行期間系統(tǒng)出現(xiàn)的異常 , 該類異常繼承于 RuntimeException, 該類異常在編譯時(shí)系統(tǒng)不進(jìn)行檢查 , 如 NullPointerExcetpion,NumberFormatException.
3.?????? 系統(tǒng)錯(cuò)誤 , 一般是 JVM 出現(xiàn)異常時(shí)拋出的異常 , 如 OutofMemoryError, 這樣的異常在 J2EE 開發(fā)中是不用關(guān)心的 .
在 J2EE 開發(fā)中 , 檢查型異常被濫用以至于過一段時(shí)間程序員自己都看不懂拋出這樣的異常 ,. 里面封裝的這些錯(cuò)誤信息是干什么用的 , 更可怕的是有好多有用的信息找不到了 . 比如 SQLException 和 RemoteException 這樣的異常我們沒必要再進(jìn)行封裝 , 這樣的異常只對(duì)我們調(diào)試程序有用 , 而對(duì)客戶來說它就是一個(gè) ” 系統(tǒng)錯(cuò)誤 ” 而已 . 異常處理有一個(gè)簡單的原則 , 你什么時(shí)候需要封裝自己的檢查型異常 ? 就是你很清楚自己拋出這個(gè)異常的用途時(shí) , 比如用戶輸入用戶名和密碼要登錄 , 但用戶名和密碼不匹配 , 你就要定義一個(gè)檢查型異常 , 客戶端通過捕獲該異常 , 然后把相應(yīng)的錯(cuò)誤信息反饋給客戶 . 而其它的自己未預(yù)期的錯(cuò)誤或者異常比如 SQLException, 只需封裝到 EJBException 中 ,ejb container 會(huì)把它的信息追加到 RemoteException 里 , 這樣客戶端捕獲 RemoteException 后把它寫到系統(tǒng)日志里 , 就很容易進(jìn)行調(diào)試 .
關(guān)于錯(cuò)誤代碼 , 一般反饋給客戶的錯(cuò)誤代碼有兩種類型 :
1.?????? 應(yīng)用程序級(jí)錯(cuò)誤 , 這些錯(cuò)誤是由客戶自身的原因引起的 , 比如輸入信息有誤 , 沒有操作該功能的權(quán)限 . 對(duì)于這樣情況 , 系統(tǒng)應(yīng)給用戶一個(gè)明確的提示 .
2.?????? 系統(tǒng)級(jí)異常 , 比如 ” 未連接到服務(wù)器 ”,” 服務(wù)器忙 ”,” 未連接到數(shù)據(jù)庫 ”,” 系統(tǒng)錯(cuò)誤 ”, 這樣的錯(cuò)誤給客戶帶來的后果是不能進(jìn)行操作 , 那么下面的戲該由系統(tǒng)管理員和系統(tǒng)開發(fā)者去演了 .
個(gè)人覺得檢查型異常對(duì)應(yīng)于應(yīng)用程序級(jí)錯(cuò)誤 , 運(yùn)行時(shí)異常對(duì)應(yīng)于系統(tǒng)級(jí)異常 .