2013-09-23 87 views
1

這是一個公開的方法,其中我不希望它在任何情況下都拋出異常。 在這個例子中,我看不到引發異常的情況(我錯過了什麼?),在這種情況下BKM是什麼?這是一個偏好問題嗎?或者在這些情況下有準則。即使沒有預料到異常,也可以使用try catch

public IEnumerable<DataEnumerable.Column> GetCollectionSchema(string collectionName) 
    { 
     // Is this try catch block redundant? 
     try 
     { 
      if (CoordinationDataCollection != null) 
      { 
       var collection = CoordinationDataCollection.FirstOrDefault(x => x.CollectionName == collectionName); 

       if (collection != null) 
       { 
        return collection.Schema; 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      _log.Error("Error occurred while trying to get collection schema", ex); 
     } 

     return new List<DataEnumerable.Column>(); 
    } 
+5

如果出現問題,你不想被告知嗎? – Arran

+1

如果CoordinationDataCollection爲null,該怎麼辦? – Liam

+0

@Arran - 不,我不在乎。 –

回答

1

我不希望它在任何情況下拋出異常。

這是不可能的。如果堆棧幾乎耗盡,它將拋出一個StackOverflowException,這是你無法壓制的。

在這個例子中,我看不到的地方拋出異常的情況下(我是 失去了一些東西?)

如果集合包含空值傳遞給FirstOrDefault Lambda表達式將拋出值。

捕捉和記錄所有異常有時是正確的。如果您使用代碼分析,您可能需要禁止警告。

1

你在這種情況下,例如去思考什麼是會發生什麼,如果在更新和現場CollectionName改變你的數據收集文件的變化?或者如果與數據庫的連接不可用會發生什麼情況。

這就是你在你的try catch中檢查的內容,當你這樣簡單的代碼時,你知道你的代碼不會崩潰 - catch可以捕獲意外的問題,例外。

1

公共方法在例外的情況下拋出異常是可以的。只要這些記錄在案,那就應該沒問題。

在你的例子中,如果CoordinationDataCollectionnull那麼它會拋出一個異常。

而不是壓制任何潛在的例外情況,最好將它們記錄下來,或允許它們被提出並允許調用者決定要做什麼。

以上只是一個例子,一大堆其他事情可能會出錯。

+0

@Yosi更新的代碼看起來不錯。如果您不希望發生任何類型的錯誤,我不認爲try catch是多餘的。你也記錄錯誤而不是忽略它。這也很好。 – Kami

1

首先,公共方法必須驗證其輸入參數:

Contract.Requires(!string.IsNullOrEmpty(collectionName)); 

第二件事:你應該趕只有那些類型的異常,是未來的您的代碼。換句話說,你發佈的方法不應該趕上Exception,因爲從調用者的角度來說,不清楚爲什麼你的方法返回了一個空的集合 - 要麼是真的是空的,要麼是異常發生。