2013-09-23 42 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,因为从调用者的角度来说,不清楚为什么你的方法返回了一个空的集合 - 要么是真的是空的,要么是异常发生。