2010-06-04 53 views
26

在設計你的類庫時,當你創建一個方法時,你什麼時候決定拋出一個異常,或者返回一個布爾值。什麼時候返回布爾,拋出一個異常和拋出哪個異常

例如。

public class MathHelper 
{ 
    public int Divide(int x, int y) 
    { 
     if(y == 0) 
     { 
      throw new DivideByZeroException("Cannot Divide by Zero"); 
     } 
     return x/y;  
    } 
} 

這是一個簡單的例子,但是然後你開始創建更復雜的方法。

你更喜歡哪一種?

public void Parse(TextReader reader, string delimeter) 
{ 
    if(reader == null) 
    { 
     throw new ArgumentNullException("The reader cannot be null"); 
    } 
    if(String.IsNullOrEmpty(delimeter)) 
    { 
     throw new ArgumentNullException("The delimeter cannot be null"); 
    } 
} 

public bool Parse(TextReader reader, string delimeter) 
{ 
    if(reader == null) 
    { 
     logger.Error("Parse failed with null reader"); 
     return false; 
    } 
    if(String.IsNullOrEmpty(delimeter)) 
    { 
     logger.Error("Parse failed with null delimeter"); 
     return false; 
    } 
} 

回答

29
  • 例外一般都去東西的地方失敗預計不會作爲一個選項的方式。

  • 布爾返回值是有時候失敗可能是預期結果的方法。

因此,在你的例子中,我會說異常。

6

Java文檔有話要說檢查先決條件的標準方式:

https://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#preconditions

也就是說,拋出一個異常,如果它是公共的,並用斷言,如果它是私有的。

+0

我真的很喜歡這個答案,因爲如果你使用它只是供內部圖書館,拋出一個異常昂貴。 – 2010-06-04 08:43:00

+0

指定的文檔鏈接已損壞。 – chammu 2015-05-10 12:44:31

+0

@chammu我可以正常訪問它。 – KnorxThieus 2016-11-08 19:19:40

1

我喜歡C#在你的例子中所要求的方式。你可以得到一個方法(int.Parse),它返回一個整數,或者拋出錯誤。您還有一個方法(int.TryParse),它使用整數值填充提供的引用參數,並返回布爾狀態代碼。這樣,如果你想要得到和異常,你呢。如果你想使用條件來處理內聯錯誤,那也是一個選項。

0

雖然接受的答案是一些好的一般建議,有一些情況下,我更喜歡(選中)例外,即使布爾方法資格:

  • 不同類型的需要不同的處理(預期)故障。替代品是int狀態代碼,它需要適當的常量和狀態代碼枚舉,這可能會更好,但仍需要明確檢查。

  • 異常傳播。有時你會在模型層檢測失敗,但只能在視圖中處理它,這在鏈中是很有用的。因此,不要讓所有函數都返回布爾值並傳播返回值,而是使用異常的默認行爲並將它們捕獲到最頂層。