这是一种公共方法我不希望它在任何情况下都抛出异常。 在这个例子中,我看不到抛出异常的情况(我错过了什么?),在这种情况下BKM是什么?这是一个偏好的问题吗?或者在这些情况下有指导方针。
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>();
}
答案 0 :(得分:2)
公共方法可以在特殊情况下抛出异常。只要记录下来就应该没问题。
在您的示例中,如果CoordinationDataCollection
为null
,则会引发异常。
不是压制任何潜在的异常,最好是记录它们,或者允许它们被引发并允许调用者决定做什么。
上面只是一个例子;其他许多事情都可能出错。
答案 1 :(得分:1)
例如,在这种情况下您需要考虑的是,如果您的DataCollection文件在更新中发生更改并且字段CollectionName
发生更改,会发生什么?或者如果与数据库的连接不可用会发生什么。
当您使用简单的代码时,这就是您在try catch中检查的内容,您知道您的代码不会失败 - 捕获的是捕获意外问题,即异常。
答案 2 :(得分:1)
我不希望它在任何情况下都抛出异常。
那是不可能的。如果堆栈几乎耗尽,它将抛出一个无法抑制的StackOverflowException。
在这个例子中,我看不到抛出异常的情况(我是 遗失了什么?)
如果集合包含空值,则传递给FirstOrDefault
的lambda表达式将抛出。
捕获并记录所有异常有时是正确的。如果使用代码分析,则可能需要禁止警告。
答案 3 :(得分:1)
首先,公共方法必须验证其输入参数:
Contract.Requires(!string.IsNullOrEmpty(collectionName));
第二件事:您应该只捕获那些与您的代码相关的异常类型。换句话说,你发布的方法不应该捕获Exception
,因为从调用者的角度来看,不清楚为什么你的方法返回了一个空集合 - 要么它真的是空的,要么发生异常