XDocument.Load (XmlReader) Возможные исключения - PullRequest
16 голосов
/ 02 августа 2011

Каковы возможные исключения, которые могут быть выброшены при вызове XDocument.Load(XmlReader)? Трудно следовать передовым методам (т. Е. Избегать общих блоков try catch), когда документация не может предоставить важную информацию.

Заранее благодарим за помощь.

Ответы [ 3 ]

21 голосов
/ 02 августа 2011

MSDN говорит: Функциональность загрузки LINQ to XML построена на XmlReader. Поэтому вы можете перехватывать любые исключения, которые выдает XmlReader. Создайте методы перегрузки и методы XmlReader, которые читают и анализируют документ.

http://msdn.microsoft.com/en-us/library/756wd7zs.aspx ArgumentNullException и SecurityException

РЕДАКТИРОВАТЬ: MSDN не всегда говорит, правда. Итак, я проанализировал код метода Load с отражателем и получил следующие результаты:

public static XDocument Load(XmlReader reader)
{
    return Load(reader, LoadOptions.None);
}

Метод Load вызывает метод:

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.

2 голосов
/ 04 ноября 2013

XmlReader.Create(Stream) допускает два типа исключений: [источник]

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
}
0 голосов
/ 02 августа 2011

Похоже, что в онлайн-документации не указано, какие исключения он выдает ... очень плохо.Вы избавите себя от некоторых неприятностей с FileNotFoundException, используя экземпляр FileInfo и вызывая его метод Exists , чтобы убедиться, что файл действительно существует.Таким образом, вам не придется ловить исключения такого типа.[Редактировать] Перечитав ваш пост, я забыл заметить, что вы передаете XML Reader.Мой ответ основывался на передаче строки, представляющей файл (перегруженный метод).В свете этого я хотел бы (как и у другого человека, который ответил на ваш вопрос, тоже хороший ответ.)попробуйте загрузить его, чтобы увидеть, какие исключения действительно генерируются.Тогда разберись с этими случаями.

...