2009-09-10 4 views
5

프로젝트 웹 페이지 중 하나에 다음 코드가 있습니다.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); 
      } 

기본적으로 XML 배치 파일을 가져 와서 처리 할 준비가 된 객체로로드합니다.

XML 파일 중 하나가 null 문자 (XML에서는 유효하지 않음)를 포함하고있는 것으로 밝혀지기까지 최근까지도 정상적으로 작동했습니다.

이 "dudd"파일을 처리하려고하면 다음과 같은 예외가 발생합니다.

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

지금까지는 ..하지만 우리가 "계속"또는 "단계적으로" , 나는 그것이 catch 블록으로 흘러 들어가기를 기대합니다. 그러나, 그렇지 않습니다. 우리는 단순히 죽음의 붉은 화면을 얻습니다 :

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

내가 뭘 잘못하고 있니?

+0

비슷한 성공으로 SystemException, Exception, System.Xml.XmlPath.XPathException을 잡으려고 시도했습니다. – Sk93

+0

호기심에서 벗어났습니다. catch (XmlException e) {}가 {}을 (를) catch하도록 변경하면 어떻게됩니까? – Razzie

+0

Razzie : 정확히 동일합니다. 빨간 스크린이 죽었어. – Sk93

답변

5

때문이다. 그것이 예외가 처리되지 않은 이유입니다.

+0

그게 다야, 고마워! 그러나 당신은 왜 이것을 설명 할 수 있습니까 (또는 어딘가를 지적하십시오)? – Sk93

+1

catch 블록에 해당하는 try 블록에서 예외가 발생하는 경우에만 예외를 catch 할 수 있습니다. – rahul

+0

하지만 오류 (.SelectNodes)를 던지는 줄은 try catch 내에있었습니다.하지만 지금은 알 것 같습니다. XMLDocument 객체가 지연 바인딩을 사용합니까? – Sk93

2

Load()를 try 블록 안에 넣는 것에 대한 다른 대답은 맞지만 SelectNodes()가 "잡히지 않은 XmlException을 던지고있는 이유"를 실제로 설명하지는 않습니다.

실제 답변은 디버거가 소스 코드와 혼동되거나 동기화되지 않아 실제로 예외가 발생하는 것으로 잘못된 행을 표시한다는 것입니다.

정말 xDoc.Load (File.FullName)를 가리켜 야합니다. 이 경우 호출이 try 블록 내부에 있어야한다는 것은 명백합니다.

왜? 스택 추적의 마지막 줄에있는 XmlLoader.LoadNode()를 확인하십시오. .NET Reflector에서 XmlDocument.Load() 메서드 (창 내부 깊숙이)가 LoadNode() 메서드를 호출한다는 것을 알 수 있습니다.

그러나 Reflector에서도 SelectNodes() 메서드는 내부 구현의 모든 위치에서 LoadNode() 메서드를 호출하지 않는다는 것을 알 수 있습니다.

그래서 스택 추적에 따라 예외는 SelectNodes()로 인해 발생할 수 없습니다.

코드를 변경하고 디버깅을 시작했지만 디버깅 기호가 올바르게 업데이트되지 않은 경우 이전과 같이 디버거가 이와 같이 혼동스러워합니다. 솔루션을 정리하고 다시 빌드하여 디버깅 기호를 새로 고칩니다.

+1

나는 재부팅하고, 솔루션을 청소하고, 재구성하고 재시험을했다. 그리고 여전히 "잘못된"라인에서 실패한다. 그러나 try catch 내에서 줄을 스틱하고 밟으면 "load"줄에서 깨집니다. – Sk93

관련 문제