2009-10-11 22 views
2

這是我的函數聲明我應該從方法中拋出異常的數量是否有限制?

public init(){ 
    try{ 
     initApplication(); 
    }catch(A1Exception){ 

    }catch(A2Exception){ 

    ... 
    }catch(A5Exception){ 

    } 
} 

private void initApplication() throws A1Exception, A2Exception, A3Exception, A4Exception, A5Exception { 
    initApp1(); //throws A1, A2, A3 
    initApp2(); //throws A4, A5 
} 

Q1。這會對性能產生影響嗎?第二季度銷售價格下降,第二季度銷售價格下降,第三季度銷售價格下降。你在initApplication()中看到異味嗎?

+0

什麼是「氣味」? – 2009-10-11 19:06:19

回答

4

近年來一直是checked異常是相當有害的感覺。每個這些例外(如果它們被選中)都會強制調用方法必須處理它們或聲明它們。這打破了封裝,因爲現在較低級別的實現細節泄漏到更高級別。這個

Joshus布洛赫會談Effective Java,我強烈建議。

0

Q1。這會對性能產生影響嗎?

  • 不,如果它們是 '真正的' 異常(即不用於正常的程序的控制流程)

Q2。你看到initApplication()有味嗎?

  • 不,如果initApplication()可以預計,以提高ñ例外,即如果有N - 特殊情況下,可以防止initApplication()無法完成它的工作。
0

1:對性能的影響將是最小的...

2:但它不一定是一個好主意,因爲有過多的鍋爐板代碼,使得它難以閱讀。如果每個異常都以相同的方式處理,那麼您應該捕獲基類Exception。或者你可以讓initApplication()拋出一個自定義的異常 - 就像ApplicationInitializationException,這個異常傳達了一些錯誤的含義。您可以將異常消息設置爲確切的詳細信息。

在某些情況下,您可能會得到5個不同的例外,並且可能需要以不同方式處理所有例外。在這種情況下,捕獲所有5個將是正確的事情。但值得考慮的是,在你實施它之前是否真的有必要。

1

我沒有看到拋出異常代碼需要的問題。看這個例子的第一印象是,在這裏可以使用Exceptions來控制應用程序的流程。小心不要這樣做。例外情況只應在特殊情況下觸發。

爲什麼不應該通過異常處理流程流的一個原因是引發異常是一個昂貴的過程。雖然多個catch塊的結構不會導致性能下降,但使用Exceptions控制流的(潛在的)底層進程將無法很好地運行。

考慮到這一點,有沒有「氣味」?只有在代碼的設計中上述擔憂是正確的。

1

對於一個方法拋出多少個異常沒有限制。 您拋出的異常越多,您可以針對捕獲的任何異常越具體。

我只想指出一些我遵循的建議。 :1)至少必須在最後一個通用的異常,所以如果它可以在你的代碼中出現任何其他異常被捕獲不是被拋向調用的類。 2)你可以有異常類像BusinessLogic異常,InvalidDataException,SystemsException的類別,所以你實際上可能少沒有例外的任何方法被拋出。 (除非您的業務需要確切的例外情況 3)始終有錯誤代碼,而不是拋出實際的文本消息,這將使您的應用程序語言無關。

0

如果沒有異常,沒有性能影響,如果有異常被拋出,還有一些開銷找到匹配的catch將成長爲您添加更多的例外,但它不應該的問題,因爲異常應該是ER。例外。在一般情況下不應該發生。

換句話說,如果你不使用拋出異常來控制宥應該確定你的程序的流程,如果你這樣做肯定是一種氣味,無論你有多少catch子句有

0

在一個純粹的技術說明,class文件格式引入了65536例外的上限。 u2類型的exceptions_table_length是無符號雙字節數量的簡寫。

The Code attribute has the following format:

Code_attribute { 
u2 attribute_name_index; 
u4 attribute_length; 
u2 max_stack; 
u2 max_locals; 
u4 code_length; 
u1 code[code_length]; 
u2 exception_table_length; 
{  u2 start_pc; 
     u2 end_pc; 
     u2 handler_pc; 
     u2 catch_type; 
} exception_table[exception_table_length]; 
u2 attributes_count; 
attribute_info attributes[attributes_count]; 
} 

我只在你生成代碼的情況下提起這事。 JSP開發人員通常不得不擔心生成的方法超過64KB代碼大小的問題。這個和其他限制在Section 4.10 Limitations of the Java Virtual Machine中列出。

+0

不知道。尼斯 – pankajt 2009-10-11 17:32:55

0

我想這個答案是大都與Q2,但鑑於它是不是這樣的技術,但可能是值得考慮反正是以下兩個問題背後的一個?

  • 用戶抓住他們所有人都有意義嗎?
  • 你想冒險讓用戶厭倦有大量的catch塊,而只是插入一個「catch(Exception ex){// ex.printStackTrace(); //如果我們發現問題,請啓用此功能}」或者類似和愚蠢的東西。?

在這種情況下,我猜它可能不相關,但我認爲在做一般的API設計時值得考慮。

0

因爲似乎沒有人提到它:

我會說,如果一個方法拋出很多不同的例外,它可能會做很多事情。尤其是許多不同的事情

0

不要拋出任何異常,除非要在發生異常時採取措施。爲了記錄目的,將檢查的異常轉換爲運行時異常。

關於該主題的更多信息可以發現here

相關問題