之前一直認為在Java裡如果每個task是相對獨立、並且是可以容忍錯誤的,那麼只需要處理Checked Exception(這個是Java強制的)和主動處理Unchecked Exception(派生至RuntimeException)即可。
但是昨天在伺服器端程式碼除錯後發現,Java裡面有好多種方法可以throw上面兩種方法不能處理的Undeclared Checked Exception,具體做法可以參考:http://java.dzone.com/articles/throwing-undeclared-checked
而由於我們是使用的netty框架,仔細閱讀其原始碼後發現,netty使用了上面連結裡說的方法一和方法五
Method #1: the sun.misc.Unsafe class
Method #5: Generics
並且netty裡面為了處理未知異常,隔離開各個task的處理,都是捕獲了Throwable,並且發現在netty裡面確實會throw Error的,於是我將原來用來隔離獨立、可以容忍錯誤的task的捕獲RuntimeException改成了捕獲Throwable。
分析總結以後,我將Java的Exception劃分為三類:
Checked Exception
Unchecked Exception
Undeclared Checked Exception
第三種我認為這是java的潛在導致錯誤的問題,但存在了,我們就應該主動處理。