2011-12-19 13 views
6

私は何かが欠けているに違いありません...どのように例外がスローされる可能性がありますが、例外に続くコードはまだデバッガでヒットしますか?例外の後にコードがどのように実行されますか?

private UpdaterManifest GetUpdaterManifest() 
{ 
    string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest"); 

    if (!File.Exists(filePathAndName)) 
    { 
     // This line of code gets executed: 
     throw new FileNotFoundException("The updater manifest file was not found. This file is necessary for the program to run.", filePathAndName); 
    } 

    UpdaterManifest updaterManifest; 

    using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open)) 
    { 
     // ... so how is it that the debugger stops here and the call stack shows 
     // this line of code as the current line? How can we throw an exception 
     // above and still get here? 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(UpdaterManifest)); 
     updaterManifest = xmlSerializer.Deserialize(fileStream) as UpdaterManifest; 
    } 

    return updaterManifest; 
} 
+1

おそらく、あなたは遠くチェーンまで例外をキャッチ? –

+1

多分あなたは別のスレッドを見ていますか? – Strillo

+0

このコードは複数のスレッドからアクセスされますか? –

答えて

5

いくつかのシナリオのこれは、一般的に起こることができる場所:

  • オプション「を正確に元のバージョンを一致させるためにソースファイルを必要とするが、」オフにするとき。その場合、ファイルが同期していないときに警告が表示されません。

  • 「ビルドエラーがありました。最後に成功したビルドを続行しますか?」、その場合、IDEが正しい行について間違っている可能性があります。これは、以前のバージョンが実行されているためです。

  • コードのリリースバージョンをデバッグしているときに、特定の部分が最適化されている場合。この結果、強調表示された行は、ソース内の次の利用可能な行になり、最適化されたコードに反映されます(これは、最適化された外部アセンブリでデバッグするときによく見られます)。


編集:私は一種-のコードを読み違えます。 "スロー"と強調表示される行の間には、変数の宣言だけがあり、実行されるコードは一切ありません。私はあなたが "using ..."というコードが強調表示されていることを意味していると思いますか?これは期待通りです。これはthrow文の後の最初の行です(throw文自体はデバッガのエラーを「キャッチ」しません)。

参照のスクリーンショット: enter image description here

+1

"ソースファイルの要求..."がチェックされています。また、ビルドエラーもありません。私はリリース版をデバッグしていません。これは私が知っていたはずの、何かばかげたものになってしまいますが、今は私は立ち往生しています。 –

+0

ありがとう、アベル。私はcatchブロックが次の行であると予想していました。 Marcが言ったように、たぶんIDEがラインから外れているだけかもしれない。私の例外はあなたが上に示した通りです。私はその点の後にF10を押すと、キャッチブロックに正しく引き込まれます。 –

+0

正確に。ありがとうございました。 –

関連する問題