保存XDocument时会发生什么异常?

时间:2013-06-20 12:41:56

标签: c# exception-handling linq-to-xml

在我的C#应用​​程序中,我使用以下语句:

public void Write(XDocument outputXml, string outputFilename) {
  outputXml.Save(outputFilename);
}

如何找出Save方法可能抛出的异常?最好是在Visual Studio 2012中,或者在MSDN文档中。

XDocument.Save没有提供任何参考。它适用于其他方法,例如File.IO.Open

2 个答案:

答案 0 :(得分:6)

不幸的是,MSDN没有关于XDocument以及 System.Xml.Linq 命名空间中的许多其他类型引发的异常的任何信息。

但这是如何实施节约:

public void Save(string fileName, SaveOptions options)
{
    XmlWriterSettings xmlWriterSettings = XNode.GetXmlWriterSettings(options);
    if ((declaration != null) && !string.IsNullOrEmpty(declaration.Encoding))
    {
        try
        {
            xmlWriterSettings.Encoding = 
               Encoding.GetEncoding(declaration.Encoding);
        }
        catch (ArgumentException)
        {
        }
    }

    using (XmlWriter writer = XmlWriter.Create(fileName, xmlWriterSettings))    
        Save(writer);        
}

如果你要深入挖掘,你会发现存在大量可能的异常。例如。 XmlWriter.Create方法可以抛出ArgumentNullException。然后创建XmlWriter,其中包含FileStream创建。在这里,您可以抓住ArgumentExceptionNotSupportedExceptionDirectoryNotFoundExceptionSecurityExceptionPathTooLongException等。

所以,我认为你不应该试图抓住所有这些东西。考虑在特定于应用程序的异常中包装任何异常,并将其抛出到应用程序的更高级别:

public void Write(XDocument outputXml, string outputFilename) 
{
   try
   {
       outputXml.Save(outputFilename);
   }
   catch(Exception e)
   {
       throw new ReportCreationException(e); // your exception type here
   } 
}

调用代码只能捕获ReportCreationException并记录它,通知用户等

答案 1 :(得分:1)

如果MSDN没有声明任何我猜这个类不会抛出任何异常。虽然,我不认为这个对象会负责将实际文件写入磁盘。因此,您可能会收到XDocument.Save();

使用的其他类的异常

为了安全起见,我会捕获所有异常并尝试一些明显不稳定的指令,请参阅下文。

try
{
  outputXml.Save("Z:\\path_that_dont_exist\\filename");
}
catch (Exception e)
{
  Console.WriteLine(e.Message);
}

在这里,捕获Exception将捕获任何类型的异常。