2011-12-17 44 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 
} 
相关问题