为什么我的异常没有被捕获
本文关键字:我的 异常 为什么 | 更新日期: 2023-09-27 18:18:04
我有以下代码。我将它包含在try块中,并使用"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";
}
查询时。执行时产生一个异常,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步进后的下一行是完全跳出代码块/方法。
为什么异常不在catch桶中?
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();
};
确切的名称必须不同,但它们会在智能感知上显示。
变量声明(例如var se
)不是可执行语句,因此调试器不会在该代码行上停止。
第二个问题是在第二个catch块中重新抛出异常。绝对没有理由捕获一个异常然后重新抛出它。如果你不打算处理它,而只是重新抛出它,那么从一开始就没有必要捕获它。
还要记住(正如Henk提到的),当单步执行代码时,优化可能会干扰一些事情。在尝试理解执行顺序之前,请确保在禁用所有优化的情况下构建项目。
除了您在调试器中看到的单步执行代码之外,为什么您认为不是进入适当的catch块?我从来没有见过异常处理代码不工作。
如果你真的想知道你是否在一个catch块中着陆,在块中放置一些具有可见效果的代码。比如呼叫MessageBox.Show()
。如果您看到消息框,那么您已经进入了catch块。如果没有,那么你就没有。
在调试过程中,消息框有时会引入其他副作用,特别是在编写UI代码时,但这不是那种情况。
你可以让它逐行执行,但是你的代码实际上需要在catch中做一些事情。
例如,
String t = "Testing";
t += "Another test";
会让你进入那里,在那里你至少可以看到异常。我猜这就是你想要做的?
如果您想捕获异常,请使用DataServiceQueryException
catch (DataServiceQueryException ex)
{
ex.Message
}