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

本文关键字:catch try 异常 | 更新日期: 2023-09-27 18:32:34

这是一个

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

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

公共方法可以在特殊情况下引发异常。 只要这些被记录下来,那么它应该没问题。

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

与其禁止显示任何潜在的异常,不如记录它们,或者允许引发它们并允许调用方决定要做什么。

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

无论如何,我不希望它引发异常。

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

在这个例子中,我看不到抛出异常的情况(我是 缺少一些东西?

如果集合包含 null 值,则传递给 FirstOrDefault 的 lambda 表达式将引发。

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

例如,在这种情况下

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

这就是您在尝试捕获中检查的内容,当您使用诸如此类的简单代码时,您知道您的代码不会失败 - 捕获是捕获意外问题(即异常)。

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

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

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