2009-09-10 6 views
5

私は、私たちのプロジェクトのWebページのいずれかで、次のコードを持っている: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ファイルの1つにヌル文字(XMLでは無効)が含まれていることが最近判明するまで、うまくいきました。

それがこの「dudd」ファイルを処理しようとすると、我々は次の例外を取得:これまで

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

[OK]を..しかし、私たちは、その後、「継続」または「ステップ・オーバー」しようとすると、私はそれがcatchブロックに流れ込むことを期待しています。 しかし、そうではありません。私は間違って何をやっている

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

:我々は単に死の赤い画面を取得しますか?

+0

同様の成功でSystemException、Exception、System.Xml.XmlPath.XPathExceptionをキャッチしようとしました。 – Sk93

+0

奇妙なことから、catch(XmlException e){}をキャッチ{}するように変更するとどうなりますか? – Razzie

+0

Razzie:まったく同じ。赤い画面が死にます。 – Sk93

答えて

5

あなたは、tryブロック内

xDoc.Load(File.FullName); 

を書いていないので、それはあります。それが例外が処理されなかった理由です。

+0

それはありがとう!しかし、なぜあなたはこの事件があるのか​​説明することができますか? – Sk93

+1

catchブロックに対応するtryブロックに例外が発生した場合にのみ例外をキャッチできます。 – rahul

+0

しかし、エラー(.SelectNodes)を投げていた行はtry catch内にありました..しかし、私は今知っていると思います。 XMLDocumentオブジェクトは遅延バインディングを使用しますか? – Sk93

2

Load()をtryブロック内に置くことに関するもう1つの答えは正しいですが、SelectNodes()が "捕捉されていない" XmlExceptionをスローする理由を実際は説明しません。

実際の答えは、デバッガがソースコードと混同されているか、同期していないということです。実際には、例外が発生したとして間違った行が表示されています。

本当にxDoc.Load(File.FullName)を指すはずです。その場合、この呼び出しはtryブロック内にあるはずです。

なぜですか?スタックトレースの最後の行にあるXmlLoader.LoadNode()を確認します。 .NET Reflectorでは、XmlDocument.Load()メソッド(その深い部分)がLoadNode()メソッドを呼び出すことがわかります。

しかしながら、反射鏡で、内部実装の任意の場所に)SELECTNODES()メソッドはLoadNodeを(呼び出さないことがわかります。

したがって、スタックトレースによれば、例外はSelectNodes()によって引き起こされていない可能性があります。私は、デバッガを見てきました

は、コードの変更が行われ、デバッグが開始されたときに前に、このような混乱が、デバッグシンボルが正しく更新されていません。ソリューションのクリーニングと再構築を行い、デバッグシンボルを更新してください。

+1

私は再起動し、ソリューションをきれいにし、再構築して再テストしましたが、それでも "間違った"行で失敗します。 しかし、try catchの中に行を張って、それを歩いていくと、 "load"行で壊れます。 – Sk93

関連する問題