2009-09-10 17 views
5

que tienen el código siguiente en una de nuestras páginas web Proyectos:Parece que no puede manejar 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); 
      } 

Es básicamente toma un archivo por lotes XML y lo carga hasta como un objeto, lista para ser procesada.

Ha funcionado bien, hasta hace poco, cuando se descubrió que uno de los archivos XML contenía un carácter nulo (que no es válido en XML).

Cuando intenta procesar este archivo "Dudd", obtenemos la siguiente excepción:

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

bien hasta ahora .. pero cuando se trate de "continuar" o "pasar por encima", Espero que fluya al bloque catch. Sin embargo, no es así; simplemente obtenemos la pantalla roja de la muerte:

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

¿Qué estoy haciendo mal?

+0

Han intentado detectar SystemException, Exception, System.Xml.XmlPath.XPathException con un éxito similar ... – Sk93

+0

por curiosidad, ¿qué ocurre cuando cambias catch (XmlException e) {} para catch {}? – Razzie

+0

Razzie: Exactamente lo mismo. Lanza la pantalla roja de la muerte. – Sk93

Respuesta

5

Se debe a que no has escrito

xDoc.Load(File.FullName); 

dentro del bloque try. Esa es la razón por la cual la excepción no fue manejada.

+0

¡Eso es todo, gracias! ¿Pero podría explicar (o señalar a algún lugar) por qué es este el caso? – Sk93

+1

Puede capturar una excepción solo si ocurre en un bloque try correspondiente al bloque catch. – rahul

+0

Pero la línea que arrojaba el error (.SelectNodes) estaba dentro de la captura de prueba ... Pero creo que ahora sé; ¿el objeto XMLDocument utiliza el enlace perezoso? – Sk93

2

La otra respuesta acerca de poner Load() dentro del bloque try es correcta, pero en realidad no explica por qué SelectNodes() "aparece" para arrojar una XmlException que no está siendo capturada.

La respuesta real es que el depurador está confundido/desincronizado con su código fuente y muestra una línea incorrecta como la causa de la excepción.

Realmente debería estar apuntando a xDoc.Load (File.FullName); , en cuyo caso sería claro que esta llamada debería estar dentro del bloque try.

¿Por qué? Observe el XmlLoader.LoadNode() en la última línea del seguimiento de la pila. En .NET Reflector puede ver que el método XmlDocument.Load() (en lo profundo de sus entrañas) llama al método LoadNode().

Sin embargo, también en el reflector, se puede ver que el método SelectNodes() no llama a LoadNode() en ninguna parte de su implementación interna.

De acuerdo con el seguimiento de pila, la excepción no puede haber sido causada por SelectNodes().

He visto al depurador confundirse así antes cuando se realiza un cambio de código y se inicia la depuración, pero los símbolos de depuración no se han actualizado correctamente. Intente limpiar y reconstruir su solución para actualizar los símbolos de depuración.

+1

He reiniciado, limpio la solución, reconstruido y vuelto a probar, y aún falla en la línea "incorrecta". Sin embargo, pegue las líneas dentro de la captura de prueba y pise a través de ella, se rompe en la línea de "carga" .. impar – Sk93

Cuestiones relacionadas