我正在编写一个名为类别的类,它包含两个静态方法,用于从外部资源中提取XML数据。在下面的例子中,我只会展示一个,因为它们非常相似。
我想弄清楚的是,这段代码在无效URL、无效数据等方面是否“安全”。基本上能让它更强壮。,这是代码
private static string XmlUri
{
get { return "path-to-xml-file"; }
}
private static XDocument XmlFile { get; set; }
public int ID { get; set; }
public string Name { get; set; }
public int Parent { get; set; }
/// <summary>
/// Gets a specific category
/// </summary>
/// <param name="id"></param>
/// <returns>A Category with the specified ID</returns>
public static Category Get(int id)
{
try
{
if (XmlFile == null)
XmlFile = XDocument.Load(XmlUri);
}
// Invalid URL or data
catch (Exception ex)
{
// TODO: Log exception
Console.WriteLine(ex.Message);
}
if (XmlFile == null)
return null;
var cat = from category in XmlFile.Descendants("Category")
where category.Attribute("id").Value.ParseSafe() == id
select new Category
{
ID = category.Attribute("id").Value.ParseSafe(),
Parent = category.Attribute("parent").Value.ParseSafe(),
Name = category.Value
};
return cat.SingleOrDefault();
}发布于 2011-02-24 22:09:19
定义“安全”。当出现问题时,您的代码将生成null。我会考虑(重新)在XDocument.Load()之后添加catch块。为了在中安全起见,不要忽略无效的。
这也给ParseSafe()和SingleOrDefault带来了疑问。如果id丢失或格式错误,您想要发生什么?
还有,一个小小的改进:您可以将按需负载逻辑放入XmlFile的getter中。如果你还想要类别之外的其他元素,那就更容易了。
发布于 2011-02-24 22:11:32
不像ChaosPandion提到的线程安全。
混淆性能行为- Get(int)看起来像是简单的快速方法,但实际上涉及到一些重要的工作。使用延迟初始化,并将整个类别集合逐个读入字典。
不应该捕获异常并吞下它--要么使用特定的异常(在本例中我认为是IOException和XMLExcepetion ),要么至少允许正常抛出致命的异常。
显然,如果您不控制XML文件,那么在加载异常大的文件时,它也会导致缓慢/挂起。取决于读取器的行为和XML的复杂性(如果由恶意方提供给您)可能会导致其他一些异常,如StackOverflow杀死您的进程。
https://stackoverflow.com/questions/5110884
复制相似问题