如果Dictionary不包含键,是否可以抛出异常

时间:2016-08-12 05:53:47

标签: c#

我正在编写一些从对象获取属性并使用它们填充pdf的代码。

我用来从字典中获取项目的代码如下:

        public static int? GetYPrintCoord(string word)
        {
            // Try to get the result in the static Dictionary
            PrintCoord result;
            if (Dict.TryGetValue(word, out result))
            {
                return result.Y;
            }
            else
            {
                return null;
            }
        }

字典的样子:

Dictionary<string, PrintCoord> Dict = new Dictionary<string, PrintCoord>();

事情是,我在调用GetYPrintCoord(string word)时检查空值。事实是,如果字典中的项目不存在,则整个pdf不值得生成,因为它将包含错误数据。我正在考虑而不是将方法改为:

    public static int GetYPrintCoord(string word)
    {
        // Try to get the result in the static Dictionary
        PrintCoord result;
        if (Dict.TryGetValue(word, out result))
        {
            return result.Y;
        }
        else
        {
            throw new KeyNotFoundException();
        }
    }

这是不好的做法/不可取的吗?在用户术语中抛出异常和崩溃实际上要好得多,因为至少用户不会查看无效的pdf,也可能不知道它是无效的。

2 个答案:

答案 0 :(得分:7)

你重新发明轮子,这是内置的行为,除非你在抛出异常之前需要做一些记录:

PrintCoord result = Dict[word]; // is equivalent to your code.

如果找不到密钥,则抛出异常。

所以基本上你会使用TryGetValue,如果你希望在字典中找不到密钥,你就可以了。第二种情况是,如果您不想使用try...catch,只需使用简单的if语句来处理未找到密钥的情况。

答案 1 :(得分:2)

如名称所示,例外情况表示例外情况。

如果在字典中找不到密钥的事实表明某个地方出现了问题,也就是说,它不是应该发生的事情,那么异常可能是有意义的。

话虽如此,如果预计有时候找不到所需的密钥,则异常可能没有意义。您可以执行的操作,可以将GetYPrintCoord方法重命名为TryGetYPrintCoord。然后,如果找到密钥,则使方法产生布尔值True,否则False,并使用out关键字传回字典中的值。