2009-09-10 12 views
5

Mam następujący kod w jednym z naszych projektów stron:Nie można obsłużyć 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); 
      } 

Zasadniczo zajmuje plik wsadowy xml i ładuje go jako obiekt, gotowy do przetworzenia.

Działa to dobrze, do niedawna, gdy znaleziono jeden z plików XML zawierający znak null (który jest nieprawidłowy w XML).

Gdy próbuje przetworzyć ten „dudd” plik, otrzymujemy następujący wyjątek:

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

Ok tak daleko .. ale gdy następnie spróbuj „dalej” lub „krok nad” Spodziewam się, że wpłynie do bloku catch. Jednak tak się nie dzieje; po prostu dostać czerwoną ekran śmierci:

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

Co robię źle?

+0

Próbowałem uchwycić wyjątek SystemException, Exception, System.Xml.XmlPath.XPathException z podobnym sukcesem. – Sk93

+0

z ciekawości, co się dzieje, gdy zmienia się catch (XmlException e) {}, aby złapać {}? – Razzie

+0

Razzie: Dokładnie to samo. Wyrzuca czerwony ekran o śmierci. – Sk93

Odpowiedz

5

To dlatego, że nie napisałem

xDoc.Load(File.FullName); 

wewnątrz bloku try. Z tego powodu wyjątek nie został rozwiązany.

+0

To wszystko, dzięki! Ale czy mógłbyś wyjaśnić (lub wskazać gdzieś), dlaczego tak się dzieje? – Sk93

+1

Możesz wychwycić wyjątek tylko wtedy, gdy występuje w bloku try odpowiadającym blokowi catch. – rahul

+0

Ale linia, która rzuciła błąd (. Wybierz węzły) była w próbie catch .. Ale myślę, że wiem teraz; czy obiekt XMLDocument korzysta z leniwego powiązania? – Sk93

2

Inna odpowiedź na temat umieszczania Load() wewnątrz bloku try jest prawidłowa, ale tak naprawdę nie wyjaśnia, dlaczego SelectNodes() "pojawia się", aby rzucić wyjątek XmlException, który nie jest przechwytywany.

Rzeczywistą odpowiedzią jest to, że debugger jest zdezorientowany/niezsynchronizowany z kodem źródłowym i wyświetla nieprawidłową linię jako powodującą wyjątek.

To naprawdę powinno wskazywać na xDoc.Load (File.FullName); , w takim przypadku byłoby jasne, że to wywołanie powinno znajdować się wewnątrz bloku try.

Dlaczego? Zwróć uwagę na XmlLoader.LoadNode() w ostatnim wierszu śledzenia stosu. W programie .NET Reflector można zauważyć, że metoda XmlDocument.Load() (w głębiach) wywołuje metodę LoadNode().

Jednak również w odbłyśniku widać, że metoda SelectNodes() nie wywołuje funkcji LoadNode() w dowolnym miejscu jej wewnętrznej implementacji.

Tak więc, zgodnie ze śledzeniem stosu, wyjątek nie mógł być spowodowany przez SelectNodes().

Widziałem, jak debugger jest zdezorientowany w ten sposób wcześniej, kiedy wprowadzono zmianę kodu i rozpoczęto debugowanie, ale symbole debugowania nie zostały poprawnie zaktualizowane. Spróbuj oczyścić i ponownie zbudować rozwiązanie, aby odświeżyć symbole debugowania.

+1

Uruchomiłem ponownie, wyczyściłem rozwiązanie, przebudowałem i przetestowałem i nadal nie działa na "niewłaściwej" linii. Jeszcze trzymać linie w próbie catch i przechodzić przez nie, łamie się na linii "obciążenia" .. – Sk93

Powiązane problemy