为什么我的例外没有被抓住?

时间:2011-12-17 14:52:40

标签: c# .net exception exception-handling try-catch

我有以下代码。我将它包含在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在以catch开头的行上停止(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之后的下一行是完全跳出该代码块/方法。

为什么异常不属于其中一个捕获桶?我完全糊涂了。

4 个答案:

答案 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();
};

确切名称必须不同,但它们会显示在intellisense上。

答案 1 :(得分:2)

变量声明(例如var se)不是可执行语句,因此调试器不会停止在该行代码上。

第二个问题是你在第二个catch块中重新抛出异常。绝对没有理由抓住异常然后重新抛出它。如果你不打算处理它并且你只是要重新抛出它,那么首先抓住它是没有意义的。

还要记住(正如Henk所提到的)当单步执行代码时,优化会干扰事情。在尝试理解执行顺序之前,请确保已在禁用所有优化的情况下构建项目。


除了您在调试器中单步执行代码之外,为什么您认为进入相应的catch块?我从未见过异常处理代码工作。

如果您真的想知道是否登陆其中一个catch块,请将一些具有可见效果的代码放入块中。就像打电话给MessageBox.Show()一样。如果您看到消息框,那么您已经在catch块内部结束了。如果没有,那么你没有。

有些时候调试消息框会引入其他副作用,特别是在编写UI代码时,但这不是其中一种情况。

答案 2 :(得分:0)

你可以让它逐行执行,但你的代码实际上需要在catch中做一些事情。

例如,只需

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

那会让你进入那里,你至少可以看到异常。我认为那是你想要做的事情?

答案 3 :(得分:0)

如果您想捕获异常,请使用DataServiceQueryException

catch (DataServiceQueryException ex)
 {
ex.Message
}