0%

Dive into Checked Exception in Java

有時間回頭看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) {
// Do something about e
// Rethrow a runtime exception
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