即使没有预期的异常,也可以使用try catch

时间:2013-09-23 10:03:08

标签: c# exception exception-handling

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

答案 0 :(得分:2)

公共方法可以在特殊情况下抛出异常。只要记录下来就应该没问题。

在您的示例中,如果CoordinationDataCollectionnull,则会引发异常。

不是压制任何潜在的异常,最好是记录它们,或者允许它们被引发并允许调用者决定做什么。

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

答案 1 :(得分:1)

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

当您使用简单的代码时,这就是您在try catch中检查的内容,您知道您的代码不会失败 - 捕获的是捕获意外问题,即异常。

答案 2 :(得分:1)

  

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

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

  

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

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

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

答案 3 :(得分:1)

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

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

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