2009-09-10 9 views
5

Ich habe den folgenden Code in einem unserer Projekte Webseiten:Kann ich nicht mit XMLException umgehen?

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

Es im Grunde eine XML-Batch-Datei und lädt sie in Anspruch nimmt als ein Objekt, fertig verarbeitet werden.

Es funktionierte einwandfrei, bis vor kurzem, als eine der XML-Dateien ein Nullzeichen enthielt (was in XML ungültig ist).

Wenn es versucht, diese „Dudd“ Datei zu verarbeiten, erhalten wir die folgende Ausnahme:

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

Ok, so weit .. aber wenn wir dann versuchen, „fortsetzen“ oder „Schritt über“, Ich erwarte, dass es in den Fangblock fließt. Allerdings tut es nicht; wir einfach den roten Bildschirm des Todes erhalten:

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

Was mache ich falsch?

+0

Haben versucht, SystemException, Exception, System.Xml.XmlPath.XPathException mit ähnlichen Erfolg zu fangen. – Sk93

+0

aus Neugier, was passiert, wenn Sie catch (XmlException e) ändern {}, um {} zu fangen? – Razzie

+0

Razzie: Genau das Gleiche. Wirft den roten Bildschirm des Todes. – Sk93

Antwort

5

Es ist, weil Sie nicht

xDoc.Load(File.FullName); 

innerhalb des try-Block geschrieben haben. Aus diesem Grund wurde die Ausnahme nicht behandelt.

+0

Das war's, danke! Aber könnten Sie erklären (oder auf etwas verweisen), warum ist das der Fall? – Sk93

+1

Sie können eine Ausnahme nur abfangen, wenn sie in einem try-Block auftritt, der dem catch-Block entspricht. – rahul

+0

Aber die Zeile, die den Fehler (.SelectNodes) warf, war innerhalb des Versuches zu fangen. Aber ich denke, dass ich jetzt weiß; verwendet das XMLDocument-Objekt Lazy-Bindung? – Sk93

2

Die andere Antwort zum Setzen von Load() in den try-Block ist richtig, erklärt aber nicht, warum SelectNodes() "erscheint", um eine XmlException auszulösen, die nicht abgefangen wird.

Die tatsächliche Antwort ist, dass der Debugger verwirrt/nicht synchron mit Ihrem Quellcode ist und tatsächlich die falsche Zeile als die Ausnahme verursacht.

Es sollte wirklich auf die xDoc.Load zeigen (File.FullName); In diesem Fall wäre es klar, dass dieser Aufruf innerhalb des try-Blocks sein sollte.

Warum? Beachten Sie die XmlLoader.LoadNode() in der letzten Zeile der Stapelüberwachung. In .NET Reflector können Sie sehen, dass die XmlDocument.Load() -Methode (tief im Inneren) die LoadNode() -Methode aufruft.

Es ist jedoch auch in Reflector zu sehen, dass die SelectNodes() -Methode LoadNode() nirgends in ihrer internen Implementierung aufruft.

Entsprechend der Stack-Ablaufverfolgung kann die Ausnahme nicht durch SelectNodes() verursacht worden sein.

Ich habe gesehen, dass der Debugger wie zuvor verwirrt wird, wenn eine Codeänderung vorgenommen und das Debuggen gestartet wird, aber die Debugsymbole wurden nicht korrekt aktualisiert. Versuchen Sie, Ihre Lösung zu bereinigen und neu zu erstellen, um die Debugging-Symbole zu aktualisieren.

+1

Ich habe neu gestartet, bereinigt die Lösung, neu aufgebaut und erneut getestet und es schlägt immer noch auf der "falschen" Linie. Noch stecken Sie die Linien innerhalb der Try Catch und Schritt durch, es bricht auf der "Last" -Linie .. ungerade – Sk93

Verwandte Themen