2009-09-10 7 views
5

J'ai le code suivant dans l'une de nos pages Web projets:Vous n'arrivez pas à gérer 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); 
      } 

Il faut essentiellement un fichier batch xml et la charge comme un objet, prêt à être traité.

Cela fonctionne très bien, jusqu'à récemment, lorsque l'un des fichiers XML contenait un caractère nul (qui n'est pas valide en XML).

Quand il essaie de traiter ce fichier « Dudd », nous obtenons l'exception suivante:

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

Ok jusqu'à présent .. mais quand nous essayons ensuite de « continuer » ou « enjamber », Je m'attends à ce qu'il coule dans le bloc d'arrêt. Cependant, ce n'est pas le cas; nous avons simplement obtenir l'écran rouge de la mort:

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

Qu'est-ce que je fais mal?

+0

Avez essayé d'attraper SystemException, Exception, System.Xml.XmlPath.XPathException avec un succès similaire .. – Sk93

+0

par curiosité, que se passe-t-il lorsque vous modifiez catch (XmlException e) {} pour attraper {}? – Razzie

+0

Razzie: Exactement la même chose. Lance l'écran rouge de la mort. – Sk93

Répondre

5

Il est parce que vous ne l'avez pas écrit

xDoc.Load(File.FullName); 

à l'intérieur du bloc try. C'est la raison pour laquelle l'exception n'a pas été traitée.

+0

C'est tout, merci! Mais pourriez-vous expliquer (ou indiquer quelque part) pourquoi est-ce le cas? – Sk93

+1

Vous pouvez intercepter une exception uniquement si elle se produit dans un bloc try correspondant au bloc catch. – rahul

+0

Mais la ligne qui lançait l'erreur (.SelectNodes) était dans le catch try. Mais je pense que je sais maintenant; l'objet XMLDocument utilise-t-il la liaison paresseuse? – Sk93

2

L'autre réponse à propos de l'insertion de Load() dans le bloc try est correcte, mais n'explique pas pourquoi SelectNodes() "semble" lancer une exception XmlException qui n'est pas interceptée. La réponse réelle est que le débogueur est confus/désynchronisé avec votre code source et montre en réalité la mauvaise ligne comme étant à l'origine de l'exception.

Il devrait vraiment pointer vers le xDoc.Load (File.FullName); , auquel cas il serait clair que cet appel devrait être à l'intérieur du bloc try.

Pourquoi? Notez le XmlLoader.LoadNode() dans la dernière ligne de la trace de la pile. Dans .NET Reflector, vous pouvez voir que la méthode XmlDocument.Load() (au fond de ses entrailles) appelle la méthode LoadNode().

Cependant, également dans le réflecteur, on peut voir que la méthode SelectNodes() n'appelle pas LoadNode() n'importe où dans son implémentation interne. Ainsi, selon la trace de la pile, l'exception ne peut pas avoir été provoquée par SelectNodes().

J'ai vu le débogueur se confondre comme ça avant quand un changement de code est fait et le débogage a commencé, mais les symboles de débogage n'ont pas été mis à jour correctement. Essayez de nettoyer et de reconstruire votre solution pour actualiser les symboles de débogage.

+1

J'ai redémarré, nettoyé la solution, reconstruit et retesté et il échoue encore sur la "mauvaise" ligne. Encore coller les lignes à l'intérieur du try et le franchir, il casse sur la ligne "load" .. impair – Sk93

Questions connexes