2011-12-17 25 views
1

私は次のコードを持っています。私は、tryブロックでそれを同封して、例外をキャッチするために「試みる」:なぜ私の例外がキャッチされないのですか?

  try 
      { 
       var response = query.Execute() as QueryOperationResponse; 
      } 
      catch (System.Net.WebException s) 
      { 
       var se = e; 
       se = se + "aa"; 
      } 
      catch (Exception e) 
      { 
       var a = e; 
       a = a + "ab"; 
      } 

query.Executeラインは、それが例外を生成し、VS2010は、以下をSystem.Net(キャッチで始まる行で停止しています実行します:

System.Data.Services.Client.DataServiceQueryException was unhandled by user code 
    Message=An error occurred while processing this request. 
    Source=System.Data.Services.Client 
    StackTrace: 
     at System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents) 
     at System.Data.Services.Client.DataServiceQuery`1.Execute() 

私はをステップ実行するとき、私はそれがコード「VAR SE = 2;」に行くことを期待するか「= Eのvar A」しかし、私はF11でステップスルーするときの次の行が完全にジャンプです。そのコードブロック/メソッドの外にある

なぜ例外がキャッチバケツ?私は全く混乱している。

+0

を使用し、例外をキャッチしたい場合。 – Lee

+0

最適化をオンにしていますか?とにかく 'throw 'に向かうことになるだろう。 –

+0

ここのコードは単なるテストコードです。私はそれがキャッチに入るかどうか試してみることを期待していました。テストするにはどうすればいいのですが、それがなぜそこに行かないのかまだ分かりません。 –

答えて

4

DataServiceQuery.Execute()は非同期メソッドで、デリゲートを渡してe.MarkErrorAsHandled()を呼び出す必要があります。例外は後で表示され、同じ実行パイプラインにはありません。

e.Errorにはスローされた例外が含まれます。

query.Execute(e=>{ 
    MessageBox.Show(e.Error.ToString()); 
    e.MarkErrorAsHandled(); 
}); 

または

response = query.Execute(); 
response.Loaded += e=>{ 
    MessageBox.Show(e.Error.ToString()); 
    e.MarkErrorAsHandled(); 
}; 

正確な名前が異なっている必要がありますが、彼らはインテリセンスに表示されます。

+0

答えをありがとう。あなたは解決策を持っているように思えます。 –

2

変数宣言(たとえばvar se)は実行可能なステートメントではないため、デバッガはそのコード行で停止しません。

2番目の問題は、2番目のcatchブロックで例外を再利用していることです。例外をキャッチしてそれをやり直す理由はまったくありません。あなたがそれを扱うつもりでなく、ただそれを転覆しようとしているのであれば、それを最初に捕まえることに意味はありません。

最適化が物事を妨げる可能性があるシングルステッピングコードの場合は、(Henkが述べたように)覚えておいてください。実行順序を理解する前に、すべての最適化を無効にしてプロジェクトを構築していることを確認してください。あなたはシングルステップ、デバッガ内のコードを見ているもの以外


は、なぜあなたはそれがないは、適切なcatchブロックに入ると思いますか?私は例外処理コードではなく、の作業を見たことがありません。

キャッチブロックのいずれかに着陸しているかどうかを実際に知りたい場合は、ブロックに目に見える効果を持つコードを配置します。例えばMessageBox.Show()への呼び出しのように。メッセージボックスが表示されたら、catchブロックの内部に終わったことになります。そうでなければ、あなたはしていない。

特にUIコードを書くときにメッセージボックスに他の副作用が導入されることがありますが、これはそのようなケースの1つではありません。

+0

catchブロックに文を追加するようにコードを更新しました。デバッガはまだこれらを停止しません。 –

0

行ごとにステップ実行することができますが、コードは実際にキャッチで何かを行う必要があります。例えば

、ちょうど

String t = "Testing";  
t += "Another test"; 

あなたは、少なくとも例外を見ることができる場所、そこにあなたを取得すること。私はそれがあなたがやろうとしていることだと思いますか?

+0

はコードを変更しても、ステップスルーしません。 –

+1

実際にあなたの質問を実際に見ています(夜遅くにstackoverflowを行うべきではありません:)) - 私はAkash Kavaと同意します。他のスレッドでエラーが発生している可能性があります。 –

0

あなたは二catchブロックで例外を再スローしているDataServiceQueryException

catch (DataServiceQueryException ex) 
{ 
ex.Message 
} 
関連する問題