2011-11-01 86 views
10

我審查一個同事的代碼和我遇到類似這樣的一段代碼:是「拋出異常」不好的做法?

public X Foo1(Y y) throws Exception { 
    X result = new X(y); 
    result.Foo2(); 
    return result; 
} 

我認爲沒有必要爲throws Exception一部分,但我有困難證明這一。這可能是有道理的,如果它更具體ExceptionFileNotFound,NoMemory等),但因爲它是我認爲這是沒有必要的。有人能給我一些原因,這可能導致什麼問題,爲什麼這是不好的做法?或者這段代碼好嗎?

回答

26

throws聲明是方法合同的一部分。在定義合同時,應始終儘可能精確地爲。因此說throws Exception是一個壞主意。

由於同樣的原因,不好的做法是說一個方法在返回String時返回Object。此外,該方法的調用者必然要趕上Exception(除非他想傳播這種醜陋),並且捕捉Exception也是一個壞主意。請參閱此問題的答案:Is it a bad practice to catch Throwable?

+3

+1我可以想到幾個實際的原因,但是這個答案包含了所有這些。 – MByD

5

這會強制每個使用此方法的人處理拋出的異常。

即使你喜歡使用檢查過的異常(我不這樣做),這會讓你根本沒有任何信息可能會出現什麼樣的錯誤。所以你不能真正以有意義的方式處理它。

1

拋出聲明表示: - 你的方法裏面的東西可能會產生這樣的檢查的異常 - 你的方法是不能或不願對付它

您應使用最具體的異常,抵制誘惑,不相關的組減少拋出聲明數量的異常。如果你覺得它們太多,那麼你的方法過於複雜,應該分解成更小的更易於管理的方法。