1

这是一个公共方法,无论如何我都不希望它抛出异常。在这个例子中,我看不到抛出异常的情况(我错过了什么吗?),在这种情况下 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>();
    }
4

4 回答 4

2

公共方法在特殊情况下抛出异常是可以的。只要这些记录在案,就应该没问题。

在您的示例中,如果CoordinationDataCollection是,null那么它将引发异常。

与其抑制任何潜在的异常,不如记录它们,或者允许它们被引发并允许调用者决定做什么。

以上只是一个例子;许多其他事情都可能出错。

于 2013-09-23T10:08:22.127 回答
1

例如,在这种情况下,您必须考虑的是,如果您的 DataCollection 文件在更新中发生更改并且字段CollectionName发生更改,会发生什么?或者如果与数据库的连接不可用会发生什么。

这就是您在 try catch 中检查的内容,当您编写诸如此类的简单代码时,您知道您的代码不会失败 - catch 是为了捕获意外问题,即异常。

于 2013-09-23T10:08:13.943 回答
1

在任何情况下,我都不希望它抛出异常。

那是不可能的。如果堆栈几乎用尽,它将抛出您无法抑制的 StackOverflowException。

在这个例子中,我看不到抛出异常的情况(我错过了什么吗?)

FirstOrDefault如果集合包含空值,则传递给的 lambda 表达式将抛出。

捕获和记录所有异常有时是正确的。如果您使用代码分析,您可能需要禁止显示警告。

于 2013-09-23T10:44:14.977 回答
1

首先,公共方法必须验证其输入参数:

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

第二件事:你应该只捕获那些对你的代码来说是预期的异常类型。换句话说,您发布的方法不应该 catch Exception,因为从调用者的角度来看,不清楚为什么您的方法返回了一个空集合——要么它真的是空的,要么发生异常。

于 2013-09-23T10:46:56.373 回答