Подтвердить что ты не робот

XDocument.Load(XmlReader) Возможные исключения

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

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

4b9b3361

Ответ 1

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

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

EDIT: MSDN не всегда говорит правду. Поэтому я проанализировал код метода загрузки с отражателем и получил такие результаты:

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

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

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
}

Ответ 3

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

В свете отсутствующего списка исключений я бы предложил создать тестовый файл с искаженным XML и попытаться загрузить его, чтобы узнать, какие типы исключений действительно можно получить. Затем обработайте эти случаи.