例外処理 - 行がスキップされ、sqle が null
質問
IDE = VS7 または 2002
こんにちは、ここで本当に奇妙な問題があります。コードが期待どおりに実行されていないようです。これをデバッガで実行しているのですが、動作が非常に奇妙です。
仮想ディレクトリが ASP.NET 1.0.3705 を使用していることを確認しました。
コードは次のとおりで、デバッガーが実行ステップとして表示するものをコメントで説明します。
try
{
objConnection.Open(); // STARTS HERE
objCommand.ExecuteNonQuery(); // DOES NOT THROW EXCEPTION
int c = 0; // THIS LINE IS EXECUTED
}
catch (SqlException sqle)
{
LogError(); // THIS LINE IS NOT EXECUTED
throw sqle; // THIS LINE IS EXECUTED AFTER THE int c = 0;
// sqle IS NULL
// EXCEPTION IS NOT CAUGHT AND
// EXECUTION CONTINUES IN FINALLY BLOCK
}
finally
{
// EXECUTES AS EXPECTED FROM HERE ON OUT,
// AS THOUGH THE throw sqle; DID NOT HAPPEN.
if (objConnection.State == ConnectionState.Open) objConnection.Close();
}
これまでにこの奇妙な動作を経験した人はいますか?それを修正する方法はありますか?方法を大幅に変更する可能性がありますが、なぜこれが起こっているのかを知りたいと思っています。
sqle が null であるため、スローが期待どおりに動作しないのではないかと思います。しかし、そもそもなぜこのコードブロックに飛びついたのでしょうか?
何度かリロードし、保存して再構築し、デバッガーで実行して、この動作を何度も観察しました。
皆さん、ご協力ありがとうございました!
ではごきげんよう、
グラハム
解決
待って..コードは例外をスローしないのに、なぜ catch ブロックが実行されないのか疑問に思っていますか?
編集(コメントを参照):
それは本当に信じられないことですね。catch ブロック内の実際の例外が null だったというケースは聞いたことがありません。すでに述べたように、catch ブロック内の最初の行が実行されませんでした。これは私の意見では、例外がまったく存在しなかったという方向を示しています。
昔ながらのデバッグ手法 (Debug.WriteLine) を使用し、デバッガーをスキップしてプログラム フローをチェックしようとしましたか?
私の推測では、例外がスローされる間違った場所を見ているのではないかと思います。あるいはまったく例外がありません。
他のヒント
非常に奇妙な。私はあなたのコードで何が起こっているのかわからないんだけど、私が見た一つのことは、使用されます:
catch (SqlException sqle)
{
LogError(); // THIS LINE IS NOT EXECUTED
throw sqle; // THIS LINE IS EXECUTED AFTER THE int c = 0;
// sqle IS NULL
// EXCEPTION IS NOT CAUGHT AND
// EXECUTION CONTINUES IN FINALLY BLOCK
}
あなたが書きたいます:
catch (SqlException sqle)
{
LogError();
throw;
}
例外を再スローする。