2013-06-20 34 views
5

Trong ứng dụng C# của tôi, tôi đang sử dụng câu lệnh sau:Những ngoại lệ nào có thể xảy ra khi lưu một XDocument?

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

Làm thế nào tôi có thể tìm ra các phương pháp ngoại lệ Save có thể ném? Tốt nhất là ngay trong Visual Studio 2012 hoặc cách khác trong tài liệu MSDN.

XDocument.Save không cung cấp bất kỳ tham chiếu nào. Nó cho các phương pháp khác, ví dụ: File.IO.Open.

Trả lời

6

Thật không may MSDN không có bất kỳ thông tin nào về ngoại lệ được ném bởi XDocument và nhiều loại khác từ System.Xml.Linq không gian tên.

Nhưng đây là cách tiết kiệm thực hiện:

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

Nếu bạn sẽ đào sâu hơn, bạn sẽ thấy rằng có số lượng lớn các trường hợp ngoại lệ có thể. Ví dụ. Phương pháp XmlWriter.Create có thể ném ArgumentNullException. Sau đó, nó tạo ra XmlWriter liên quan đến việc tạo FileStream. Và ở đây bạn có thể bắt ArgumentException, NotSupportedException, DirectoryNotFoundException, SecurityException, PathTooLongException, vv

Vì vậy, tôi nghĩ rằng bạn không nên cố gắng nắm bắt tất cả các công cụ này. Xem xét để quấn bất kỳ ngoại lệ trong ứng dụng ngoại lệ cụ thể, và ném nó lên mức cao hơn của ứng dụng của bạn:

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

Calling mã có thể bắt chỉ ReportCreationException và đăng nhập nó, thông báo cho người sử dụng, vv

1

Nếu MSDN không tuyên bố bất kỳ điều gì tôi đoán là Lớp học sẽ không loại trừ bất kỳ ngoại lệ nào. Mặc dù, tôi không nghĩ rằng đối tượng này sẽ chịu trách nhiệm ghi tệp thực sự vào đĩa. Vì vậy, bạn có thể nhận được ngoại lệ từ các lớp khác được sử dụng bởi XDocument.Save();

Để an toàn, tôi sẽ bẫy tất cả các ngoại lệ và thử một số hướng dẫn rõ ràng bất thường, xem bên dưới.

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

Ở đây, bắt Ngoại lệ sẽ bắt bất kỳ loại ngoại lệ nào.

Các vấn đề liên quan