有時間回頭看Java,發現以前沒注意到的Checked Exception,看了一下主流語言只有Java和Python有做。先不論使用與否正反意見,討論一下他在語言之中的定位。
Simple Example 看一下有Checked Exception的版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class CheckExceptionTest { public void storeDataFromUrl (String url) { try { String data = readDataFromUrl(url); } catch (BadUrlException e) { e.printStackTrace(); } } public String readDataFromUrl (String url) throws BadUrlException { throw new BadUrlException("Bad URL: " + url); } }; class BadUrlException extends Exception { public BadUrlException (String s) { super (s); } };
和沒有的版本
1 2 3 4 5 6 7 8 9 10 11 12 13 class UncheckExceptionTest { public void storeDataFromUrl (String url) { String data = readDataFromUrl(url); } public String readDataFromUrl (String url) { throw new BadUrlException("Bad URL: " + url); } }; class BadUrlException extends RuntimeException { public BadUrlException (String s) { super (s); } };
差異在於兩個地方 – Function Signature有加上throws BadUrlException
– Exception繼承的Base Class不同 這樣可以提醒編譯砌牆志檢查是否有無處理的情況(是否妥善處理就是另外一件事了),立意良善,不過
How to deal with Exception 以上麵那個利子來說,如果認為storeDataFromUrl
不是一個處理Exception的好地方,只好修改這個Function的Signature
1 2 3 public void storeDataFromUrl (String url) throws BadUrlException { String data = readDataFromUrl(url); }
throws會蔓延的,如果A->B->C->D->E
的呼叫方式。A處理異常,E有Checked Exception,那麼B,C,D,E都要修改Function Signature。
Interface issue 在throws Propagate過程中,如果遇到Interface的Issue情況更加惡化
1 2 3 4 5 interface InterfaceCheck { public void storeDataFromUrl (String url) ; }; class CheckExceptionTest implements InterfaceCheck } ;
由於我們修改了storeDataFromUrl
的Signature,所以Interface部份要跟著改,而所有實做此Interface的Signature都要改。 就跟滾雪球一樣,越滾越大。
Possible Solution 如果同樣的我們想再A處理Exception,必須在原處做些簡單的處理。
1 2 3 4 5 6 7 8 9 public void storeDataFromUrl (String url) { try { String data = readDataFromUrl(url); } catch (BadUrlException e) { throw new RuntimeException("BadUrl" ); } }
這麼麻煩,那還不直接用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