C# XDocument.Load(XmlReader)可能的异常

C# XDocument.Load(XmlReader)可能的异常,c#,xml,exception,linq-to-xml,C#,Xml,Exception,Linq To Xml,调用XDocument.Load(XmlReader)时可能引发哪些异常?当文档未能提供关键信息时,很难遵循最佳实践(即避免通用的try-catch块) 提前感谢您的帮助。在线文档似乎没有说明它引发了哪些异常。。。太糟糕了。 通过使用FileInfo实例并调用其Exists方法来确保文件确实存在,您可以使用FileNotFoundException来避免一些麻烦。这样,您就不必捕获这种类型的异常。 [编辑] 在重读您的帖子时,我忘了注意到您正在传递一个XML阅读器。我的响应基于传入一个表示文件的

调用
XDocument.Load(XmlReader)
时可能引发哪些异常?当文档未能提供关键信息时,很难遵循最佳实践(即避免通用的try-catch块)


提前感谢您的帮助。

在线文档似乎没有说明它引发了哪些异常。。。太糟糕了。 通过使用FileInfo实例并调用其Exists方法来确保文件确实存在,您可以使用FileNotFoundException来避免一些麻烦。这样,您就不必捕获这种类型的异常。 [编辑] 在重读您的帖子时,我忘了注意到您正在传递一个XML阅读器。我的响应基于传入一个表示文件的字符串(重载方法)。 有鉴于此,我会(希望回答你问题的另一个人也有一个好答案)


鉴于缺少异常列表,我建议使用格式错误的XML创建一个测试文件,并尝试加载它,以查看真正抛出的异常类型。然后处理这些案件

MSDN说:LINQ到XML的加载功能是建立在XmlReader上的。因此,您可能会捕获XmlReader引发的任何异常。创建用于读取和解析文档的重载方法和XmlReader方法

ArgumentNullException和SecurityException

编辑:MSDN并不总是说是真的。所以我用reflector分析了荷载法代码,得到如下结果:

public static XDocument Load(XmlReader reader)
{
    return Load(reader, LoadOptions.None);
}
方法加载正在调用方法:

public static XDocument Load(XmlReader reader, LoadOptions options)
{
    if (reader == null)
    {
        throw new ArgumentNullException("reader"); //ArgumentNullException
    }
    if (reader.ReadState == ReadState.Initial)
    {
        reader.Read();// Could throw XmlException according to MSDN
    }
    XDocument document = new XDocument();
    if ((options & LoadOptions.SetBaseUri) != LoadOptions.None)
    {
        string baseURI = reader.BaseURI;
        if ((baseURI != null) && (baseURI.Length != 0))
        {
            document.SetBaseUri(baseURI);
        }
    }
    if ((options & LoadOptions.SetLineInfo) != LoadOptions.None)
    {
        IXmlLineInfo info = reader as IXmlLineInfo;
        if ((info != null) && info.HasLineInfo())
        {
            document.SetLineInfo(info.LineNumber, info.LinePosition);
        }
    }
    if (reader.NodeType == XmlNodeType.XmlDeclaration)
    {
        document.Declaration = new XDeclaration(reader);
    }
    document.ReadContentFrom(reader, options); // InvalidOperationException
    if (!reader.EOF)
    {
        throw new InvalidOperationException(Res.GetString("InvalidOperation_ExpectedEndOfFile")); // InvalidOperationException
    }
    if (document.Root == null)
    {
        throw new InvalidOperationException(Res.GetString("InvalidOperation_MissingRoot")); // InvalidOperationException
    }
    return document;
}
注释了可能出现异常的行

我们可以得到下一个异常:ArgumentNullException、XmlException和InvalidOperationException。 MSDN说您可以获得SecurityException,但也许您可以在创建XmlReader时获得这种类型的异常。

XmlReader.Create(Stream)
允许两种类型的异常:


是否有一些你不想抓住的例外情况?如果这是一个UI,那么异常(任何异常)意味着失败,您将无法加载文档,并且必须向用户显示错误消息。如果它更多的是服务器端的,那么任何异常都意味着您不可能从中恢复的故障,因此您最好将其包装在另一个异常中,并在全局异常处理程序出现异常时提供一些上下文。例如,我不想捕获stackoverflow或OutOfMemory异常。我想知道可以预期哪些异常,以便在本地处理它们。其他任何东西都可以冒泡到我的全局异常处理程序进行日志记录。我知道关于异常处理有许多不同的思想流派。我是开发新手(总共8个月,全职只有2个月),所以我仍然在处理所有这些。然而,不管你所信奉的学校是哪一所,我认为,希望可能的例外情况得到实际记录似乎是合理的。我们可能都同意这一点。谢谢你的回复。不幸的是,我知道格式不正确的xml也会引发一些其他错误(我偶尔也看到过这些错误)!我用reflector分析了XDocument.Load(XmlReader),发现可能有两个以上的异常InvalidOperationException和XmlException。MSDN并不总是这样说(嘿,伙计!很好的跟进。我真的很感激。我还没有探索反思。这非常有帮助。标记作为答案。除非有人能够为我提供一个列表,否则我认为这可能是我唯一的选择。不过,在文档中有一个列表肯定会很好。谢谢你的建议。检查File.Exists不是明智的选择防止
FileNotFoundException
的方法,它只会创建一个争用条件。保证文件存在的唯一可靠方法是实际打开文件并捕获
FileNotFoundException
。请阅读我的帖子。我从未建议使用file.Exists。我建议使用FileInfo实例。请不要进来在谈话结束几个月后,当你一开始从未参与过最初的谈话时,你就把我拒之门外。艾伦,你从来没有解释过为什么它会创造一个种族条件。证明的责任在于你,而不是我。
XmlReader reader; // Do whatever you want

try
{
  XDocument.Load(reader);
}
catch (ArgumentNullException)
{
  // The input value is null.
}
catch (SecurityException)
{
  // The XmlReader does not have sufficient permissions 
  // to access the location of the XML data.
}
catch (FileNotFoundException)
{
  // The underlying file of the path cannot be found
}