2013-06-20 7 views
5

Nel mio C# applicazione che sto utilizzando la seguente istruzione:Quali eccezioni possono verificarsi quando si salva un XDocument?

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

Come posso sapere quali eccezioni il metodo Save potrebbe buttare? Preferibilmente a destra in Visual Studio 2012 o in alternativa nella documentazione MSDN.

XDocument.Save non fornisce alcun riferimento. Lo fa per altri metodi, ad es. File.IO.Open.

risposta

6

Sfortunatamente MSDN non ha informazioni sulle eccezioni generate da XDocument e molti altri tipi dallo spazio dei nomi System.Xml.Linq.

Ma ecco come il risparmio realizzato:

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);   
} 

Se si scavare più a fondo, vedrete che non v'è gran numero di possibili eccezioni. Per esempio. Il metodo XmlWriter.Create può generare ArgumentNullException. Quindi crea XmlWriter che implica la creazione di FileStream. E qui si può prendere ArgumentException, NotSupportedException, DirectoryNotFoundException, SecurityException, PathTooLongException ecc

Quindi, penso che non si dovrebbe cercare di catturare tutta questa roba. Si consideri per avvolgere qualsiasi eccezione in deroga specifica applicazione, e gettarlo ai livelli più alti della vostra applicazione:

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

codice chiamante può solo prendere ReportCreationException e la sua registrazione, notifica utente, ecc

1

Se MSDN non ne indica nessuno, suppongo che Class non genererà alcuna eccezione. Sebbene, non penso che questo oggetto sarà responsabile della scrittura del file reale su disco. Quindi potresti ricevere eccezioni da altre classi usate da XDocument.Save();

Per essere al sicuro, vorrei catturare tutte le eccezioni e provare alcune ovvie istruzioni erratiche, vedi sotto.

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

Qui, la cattura di Eccezione cattura eventuali tipi di eccezioni.