我正在编写一些从对象获取属性并使用它们填充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,也可能不知道它是无效的。
答案 0 :(得分:7)
你重新发明轮子,这是内置的行为,除非你在抛出异常之前需要做一些记录:
PrintCoord result = Dict[word]; // is equivalent to your code.
如果找不到密钥,则抛出异常。
所以基本上你会使用TryGetValue
,如果你希望在字典中找不到密钥,你就可以了。第二种情况是,如果您不想使用try...catch
,只需使用简单的if语句来处理未找到密钥的情况。
答案 1 :(得分:2)
如名称所示,例外情况表示例外情况。
如果在字典中找不到密钥的事实表明某个地方出现了问题,也就是说,它不是应该发生的事情,那么异常可能是有意义的。
话虽如此,如果预计有时候找不到所需的密钥,则异常可能没有意义。您可以执行的操作,可以将GetYPrintCoord
方法重命名为TryGetYPrintCoord
。然后,如果找到密钥,则使方法产生布尔值True
,否则False
,并使用out
关键字传回字典中的值。