2011-12-17 43 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;」或「VAR A = E」然而,當我步驟通過與F11之後的下一行是一個跳轉完全在代碼塊/方法之外

爲什麼異常不會落入其中一個catch桶?我完全困惑。

+0

你重新拋出異常的第二個catch塊。 – Lee 2011-12-17 14:55:40

+0

這是優化嗎?無論如何,代碼將註定會被拋出。 – 2011-12-17 14:57:32

+0

這裏的代碼只是測試代碼。我期待並試圖測試它是否會進入捕獲階段。我如何測試,仍然不確定它爲什麼不去那裏。 – 2011-12-17 14:59:41

回答

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

感謝您的回答。聽起來像你有解決方案。 – 2011-12-17 15:13:17

2

變量聲明(如var se)不是可執行語句,因此調試器不會停止在該行代碼上。

第二個問題是您在第二個catch塊重新拋出異常。絕對沒有理由去捕捉異常,然後重新拋出異常。如果你不打算處理它,而你只是要重新拋出它,那麼首先抓住它是沒有意義的。

還記得(正如亨克提到的),當單步代碼優化可以干擾事物。在嘗試理解執行順序之前,確保已經構建了禁用所有優化的項目。


除了你看到的單步調試器中的代碼,什麼爲什麼你認爲這是不是進入相應的catch塊?我從來沒有見過異常處理代碼不是工作。

如果您確實想知道您是否在某個catch塊中着陸,請將具有可見效果的某些類型的代碼放入塊中。例如,致電MessageBox.Show()。如果你看到消息框,那麼你已經結束了catch塊。如果沒有,那麼你還沒有。

有些時候在調試中,消息框會引入其他副作用,特別是在編寫UI代碼時,但這不是其中之一。

+0

我更新了代碼以在catch塊中添加其他語句。調試器仍然停留在這些上。 – 2011-12-17 15:08:19

0

你可以讓它一行一行,但你的代碼實際上需要做一些事情。

例如,剛剛

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

,將讓你在那裏,你至少可以看看例外。我認爲這就是你想要做的?

+0

更改了代碼,仍然沒有通過。 – 2011-12-17 15:09:07

+1

實際上正確地看着你的問題(不應該做深夜的計算器:)) - 我會同意Akash Kava。這很可能是因爲該錯誤在另一個線程中。 – 2011-12-17 15:16:04

0

如果你想捕獲異常,使用DataServiceQueryException

catch (DataServiceQueryException ex) 
{ 
ex.Message 
} 
相關問題