C# 为什么我的异常没有被发现?
我有以下代码。我将其包含在一个try块中,并“try”捕获异常:C# 为什么我的异常没有被发现?,c#,.net,exception,exception-handling,try-catch,C#,.net,Exception,Exception Handling,Try Catch,我有以下代码。我将其包含在一个try块中,并“try”捕获异常: try { var response = query.Execute() as QueryOperationResponse; } catch (System.Net.WebException s) { var se = e;
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时,下一行是完全跳出该代码块/方法
为什么异常不属于其中一个捕获桶?我完全困惑了。变量声明(如var se
)不是可执行语句,因此调试器不会在该行代码上停止
第二个问题是,您在第二个catch块中重新调用异常。完全没有理由捕获异常然后重新调用它。如果您不打算处理它,而只是重新调用它,那么首先就没有必要捕获它
还请记住(正如Henk提到的)当单步执行代码时,优化可能会干扰事情。在尝试理解执行顺序之前,请确保您在构建项目时禁用了所有优化
除了您在调试器中看到的单步执行代码之外,为什么您认为它没有进入相应的catch块?我从未见过异常处理代码不起作用 如果您真的想知道您是否在某个catch块中登录,请在该块中放置一些具有可见效果的代码类型。例如,调用
MessageBox.Show()
。如果您看到消息框,那么您就进入了catch块。如果没有,那么您就没有
在调试过程中,有时消息框会引入其他副作用,特别是在编写UI代码时,但这不是其中之一。变量声明(如var se
)不是可执行语句,因此调试程序不会在该行代码上停止
第二个问题是,您在第二个catch块中重新调用异常。完全没有理由捕获异常然后重新调用它。如果您不打算处理它,而只是重新调用它,那么首先就没有必要捕获它
还请记住(正如Henk提到的)当单步执行代码时,优化可能会干扰事情。在尝试理解执行顺序之前,请确保您在构建项目时禁用了所有优化
除了您在调试器中看到的单步执行代码之外,为什么您认为它没有进入相应的catch块?我从未见过异常处理代码不起作用 如果您真的想知道您是否在某个catch块中登录,请在该块中放置一些具有可见效果的代码类型。例如,调用
MessageBox.Show()
。如果您看到消息框,那么您就进入了catch块。如果没有,那么您就没有
在调试过程中,有时消息框会引入其他副作用,特别是在编写UI代码时,但这不是其中之一。DataServiceQuery.Execute()是一种异步方法,您必须传递委托并调用e.MarkErrorAsHandled().Exception稍后显示,它不在同一执行管道中
错误将包含抛出的异常
query.Execute( e=>{
MessageBox.Show(e.Error.ToString());
e.MarkErrorAsHandled();
});
或
确切的名称必须不同,但它们将显示在intellisense上。DataServiceQuery.Execute()是一种异步方法,在该方法中,您必须传递委托并调用e.MarkErrorAsHandled()。异常稍后显示,并且它不在同一执行管道中
错误将包含抛出的异常
query.Execute( e=>{
MessageBox.Show(e.Error.ToString());
e.MarkErrorAsHandled();
});
或
确切的名称必须不同,但它们将显示在intellisense上。您可以让它逐行执行,但您的代码实际上需要在捕获中执行某些操作 例如,只是
String t = "Testing";
t += "Another test";
这将使您进入其中,您至少可以查看异常。我假设您正试图这样做?您可以让它逐行执行,但您的代码实际上需要在catch中执行一些操作 例如,只是
String t = "Testing";
t += "Another test";
这将使您进入其中,您至少可以查看异常。我假设您正试图这样做?如果您想捕获异常,请使用
DataServiceQueryException
catch (DataServiceQueryException ex)
{
ex.Message
}
如果要捕获异常,请使用
DataServiceQueryException
catch (DataServiceQueryException ex)
{
ex.Message
}
您正在第二个catch块中抛出异常。这是否启用了优化功能?无论如何,代码将注定要转到
抛出;
。这里的代码只是测试代码。我正在期待并尝试测试它是否会进入catch。我如何进行测试,但仍然不确定为什么它不会转到那里。您正在抛出异常在第二个catch块中。这是否启用了优化功能?无论如何,代码将注定要转到抛出;
。这里的代码只是测试代码。我期待并尝试测试它是否会进入catch。我如何测试它,但仍然不确定它为什么没有进入那里。我更新了代码,在catch blo中添加了其他语句cks。调试器仍然没有在这些问题上停止。我更新了代码以在catch块中添加其他语句。调试器仍然没有在这些问题上停止。感谢您的回答。听起来您有解决方案。感谢您的回答。听起来您有解决方案。实际上正确地查看您的问题(不应在深夜执行stackoverflow:)-我同意Akash Kava的观点。这很可能是因为错误在另一个线程中。实际上,正确地查看您的问题(不应在深夜执行stackoverflow:)-我同意Akash Kava的观点。这很可能是因为错误