保存 XDocument 时可能发生哪些异常

本文关键字:异常 可能发生 XDocument 保存 | 更新日期: 2023-09-27 18:19:07

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

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

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

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

保存 XDocument 时可能发生哪些异常

不幸的是,

MSDN 没有任何关于 System.Xml.Linq 命名空间中由 XDocument 和许多其他类型引发的异常的信息。

但以下是保存的实施方式:

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。然后它创建涉及FileStream创造的XmlWriter。在这里你可以捕捉到ArgumentExceptionNotSupportedExceptionDirectoryNotFoundExceptionSecurityExceptionPathTooLongException等。

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

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

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

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

为了安全起见,

我会捕获所有异常并尝试一些明显的不稳定说明,请参见下文。

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

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