我有以下代码。我将它包含在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之后的下一行是完全跳出该代码块/方法。
为什么异常不属于其中一个捕获桶?我完全糊涂了。
答案 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
}