5

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

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

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

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

4

2 回答 2

6

不幸的是,MSDN 没有任何关于System.Xml.LinqXDocument命名空间中抛出的异常和许多其他类型的信息。

但这里是如何实现保存:

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创造。在这里你可以捕捉到ArgumentException, NotSupportedException, DirectoryNotFoundException,SecurityExceptionPathTooLongException

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

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

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

于 2013-06-20T13:25:49.923 回答
1

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

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

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

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

于 2013-06-20T13:13:57.013 回答