有時間回頭看Java,發現以前沒注意到的Checked Exception,看了一下主流語言只有Java和Python有做。先不論使用與否正反意見,討論一下他在語言之中的定位。
Simple Example
看一下有Checked Exception的版本
1 | class CheckExceptionTest { |
和沒有的版本
1 | class UncheckExceptionTest { |
差異在於兩個地方
– Function Signature有加上throws BadUrlException
– Exception繼承的Base Class不同
這樣可以提醒編譯砌牆志檢查是否有無處理的情況(是否妥善處理就是另外一件事了),立意良善,不過
How to deal with Exception
以上麵那個利子來說,如果認為storeDataFromUrl
不是一個處理Exception的好地方,只好修改這個Function的Signature
1 | public void storeDataFromUrl(String url) throws BadUrlException { |
throws會蔓延的,如果A->B->C->D->E
的呼叫方式。A處理異常,E有Checked Exception,那麼B,C,D,E都要修改Function Signature。
Interface issue
在throws Propagate過程中,如果遇到Interface的Issue情況更加惡化
1 | interface InterfaceCheck { |
由於我們修改了storeDataFromUrl
的Signature,所以Interface部份要跟著改,而所有實做此Interface的Signature都要改。
就跟滾雪球一樣,越滾越大。
Possible Solution
如果同樣的我們想再A處理Exception,必須在原處做些簡單的處理。
1 | public void storeDataFromUrl(String url) { |
這麼麻煩,那還不直接用Unchecked Exception就好了,所以這一點爭議不少。
Reference
– Why doesn’t C# have checked exceptions?
– Does Java need Checked Exceptions?
– The Trouble with Checked Exceptions
– Checked or Unchecked Exceptions?
– Checked vs. Unchecked Exceptions: The Debate Is Not Over
– Checked Exceptions are Evil