2009-05-15 6 views
0

IDE = VS7または2002例外処理 - 行がスキップされ、sqleがNULLです

こんにちは、私は本当に奇妙な問題を抱えています。コードが期待通りに実行されていないようです。私はデバッガを介してこれを実行しており、それは本当に不思議なことです。

仮想ディレクトリが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であるため、スローが期待どおりに動作しない理由が考えられます。しかし、なぜ私たちは最初にこのコードブロックに飛びついたのですか?

私はそれを数回リロードし、保存して再構築し、デバッガで実行し、この動作を複数回見ました。

ありがとうございました!

すべてのベスト、

グラハム

+0

itsmattとDavid、 私が知る限り、問題はデバッガです。私はDebug.WriteLine()を使うDavidのアドバイスに従った。私は同様の問題を経験していた別のコードを持っていました。例外は発生していてはいけませんでした。 デバッガはif文を見て、その中でコードを実行することに決めました。例外が発生するはずです。 WriteLineステートメントを見ると、ifステートメント内のコードブロックが実際には実行されなかったことがわかります。 デバッガがコードを実行する方法と、実際にどのように実行されるかをデバッガがどのように考えるかは異なります。 あなたの助けをありがとう –

+0

それを聞いてよかったです。デバッガが見ているコンパイルされたアセンブリのようなサウンドは、ソースより古いです。/binフォルダを削除して、プロジェクトを再ビルドしてみることもできます。 – VVS

答えて

0

はあなたのコードが例外をスローしません、それはcatchブロックを実行しませんなぜあなたは迷っている...待って?

EDIT(コメントを参照):

信じることは本当に難しいですね。私はキャッチブロック内の実際の例外がnullであったという事例について聞いたことがなく、キャッチブロック内の最初の行は実行されませんでした。

旧式のデバッグ手法(Debug.WriteLine)を使用してプログラムフローをチェックし、デバッガをスキップしようとしましたか?

私は、例外がスローされた場所が間違っていると考えています。例外もありません。

+0

例外がスローされなくても実行されるcatchがあります。そのキャッチ内に[私はこのコードを書いていません] throw throw行が実行されますが、例外はnullで、キャッチされません。 –

+0

itsmattとDavid、私が知る限り、問題はデバッガです。私はDebug.WriteLine()を使うDavidのアドバイスに従った。私は同様の問題を経験していた別のコードを持っていました。例外は発生していてはいけませんでした。デバッガはif文を見て、その中でコードを実行することに決めました。例外が発生するはずです。 WriteLineステートメントを見ると、ifステートメント内のコードブロックが実際には実行されなかったことがわかります。これは、デバッガがコードを実行する方法と、実際にどのように実行するのかの違いです。ご協力ありがとうございました –

+0

IIRC、そのバージョンのデバッガに問題がありました。 1行のコードを実行しているかのように表示され、行をスキップしたり、他の奇妙なことが起きたりします。私はそれが後のバージョンで修正されたと思う。 binフォルダーをクリアして再構築することで、まっすぐにすることができます。 –

1

非常に奇妙です。私はあなたのコードで何が起こっているのかわからないんだけど、私が見た一つのことは、の使用である:あなたが書きたい

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; 
} 

再スロー例外へ。

+0

最初のバージョンは全く間違っていません。あなたはスタックトレースを殺すだけです。 – VVS

+0

私はそれが間違っていたとは言いませんでしたが、通常は完全なスタックトレースを見るほうがより有用でしょう。それを指摘してくれてありがとう。私は私のコメントにそれを置くことを怠っていた。 – itsmatt

関連する問題