2009-09-10 37 views
5

Tôi có đoạn mã sau vào một trong các trang web dự án của chúng tôi:Dường như không thể xử lý XMLException?

  XmlDocument xDoc = new XmlDocument(); 
      xDoc.Load(File.FullName); 

      //work through each print batch in this queue file 
      try 
      { 
       XmlNodeList nodeList = xDoc.SelectNodes("Reports/PrintBatch"); 
       foreach (XmlNode printBatch in nodeList)//xDoc.SelectNodes("Reports/PrintBatch")) 
       { 
        PrintBatch batch = new PrintBatch(); 
        batch.LoadBatch(printBatch, File.Extension); 
        this.AddBatch(batch); 
       } 
      } 
      catch (XmlException e) 
      { 
       //this report had an error loading! 
       Console.WriteLine(e.Message); 
      } 

Về cơ bản nó có một tập tin batch xml và tải nó lên như một đối tượng, sẵn sàng để được xử lý.

Nó hoạt động tốt, cho đến gần đây khi một trong các tệp XML được tìm thấy chứa một ký tự rỗng (không hợp lệ trong XML).

Khi nó cố gắng để xử lý này "dudd" tập tin, chúng tôi nhận được ngoại lệ sau đây:

alt text http://blog.ianmellor.co.uk/images/xml_err.jpg

Ok cho đến nay .. nhưng khi sau đó chúng tôi cố gắng "tiếp tục" hoặc "bước qua", Tôi hy vọng nó chảy vào khối catch. Tuy nhiên, nó không; chúng tôi chỉ đơn giản là nhận được màn hình màu đỏ của cái chết:

alt text http://blog.ianmellor.co.uk/images/xml_err2.jpg

Tôi đang làm gì sai?

+0

Đã thử bắt SystemException, Exception, System.Xml.XmlPath.XPathException với thành công tương tự .. – Sk93

+0

trong tò mò, điều gì xảy ra khi bạn thay đổi catch (XmlException e) {} để bắt {}? – Razzie

+0

Razzie: Chính xác như cũ. Ném màn hình màu đỏ o 'chết. – Sk93

Trả lời

5

Đó là vì bạn chưa viết

xDoc.Load(File.FullName); 

bên trong khối try. Đó là lý do tại sao ngoại lệ không được xử lý.

+0

Vậy đó, cảm ơn! Nhưng bạn có thể giải thích (hoặc chỉ đến một nơi nào đó) tại sao đây là trường hợp? – Sk93

+1

Bạn chỉ có thể bắt ngoại lệ nếu nó xảy ra trong khối thử tương ứng với khối catch. – rahul

+0

Nhưng dòng đã ném lỗi (.SelectNodes) là trong thử bắt .. Nhưng tôi nghĩ rằng tôi biết bây giờ; liệu đối tượng XMLDocument có sử dụng ràng buộc lười biếng không? – Sk93

2

Câu trả lời khác về việc đặt Load() bên trong khối thử là đúng, nhưng không thực sự giải thích tại sao SelectNodes() "xuất hiện" để ném một XmlException không bị bắt.

Câu trả lời thực tế là trình gỡ rối bị nhầm lẫn/không đồng bộ với mã nguồn của bạn và thực sự hiển thị sai dòng khi gây ra ngoại lệ.

Nó thực sự nên trỏ đến xDoc.Load (File.FullName); , trong trường hợp này, rõ ràng là cuộc gọi này phải nằm trong khối thử.

Tại sao? Lưu ý XmlLoader.LoadNode() trong dòng cuối cùng của dấu vết stack. Trong .NET Reflector, bạn có thể thấy rằng phương thức XmlDocument.Load() (sâu trong ruột của nó) gọi phương thức LoadNode().

Tuy nhiên, cũng trong phản xạ, có thể thấy rằng phương thức SelectNodes() không gọi hàm LoadNode() ở bất kỳ đâu trong triển khai nội bộ của nó.

Vì vậy, theo dấu vết ngăn xếp, ngoại lệ không thể gây ra bởi SelectNodes().

Tôi đã thấy trình gỡ rối bị nhầm lẫn như thế này trước khi thay đổi mã được thực hiện và gỡ lỗi bắt đầu, nhưng các biểu tượng gỡ lỗi chưa được cập nhật chính xác. Hãy thử làm sạch và xây dựng lại giải pháp của bạn để làm mới các biểu tượng gỡ lỗi.

+1

Tôi đã khởi động lại, làm sạch giải pháp, xây dựng lại và thử lại và nó vẫn thất bại trên dòng "sai". Tuy nhiên, hãy dán các đường trong vòng thử và bắt đầu qua nó, nó sẽ phá vỡ dòng "tải". – Sk93

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