【问题标题】:Why does my exception not get caught?为什么我的异常没有被捕获?
【发布时间】:2012-01-22 15:35:34
【问题描述】:

我有以下代码。我将它包含在一个 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 单步执行时,下一行是完全跳出该代码块/方法。

为什么异常没有落入其中一个捕获桶?我完全糊涂了。

【问题讨论】:

  • 您在第二个 catch 块中重新抛出异常。
  • 这是开启优化了吗?无论如何,代码注定要转到throw;
  • 这里的代码只是测试代码。我期待并试图测试它是否会被捕获。我怎样才能测试出来,但仍然不确定为什么它不去那里。

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


【解决方案1】:

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

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

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


除了您在调试器中看到单步执行代码之外,为什么您认为它没有进入适当的 catch 块?我从未见过异常处理代码起作用。

如果您真的想知道您是否在某个 catch 块中着陆,请将某种具有可见效果的代码放入该块中。比如打电话给MessageBox.Show()。如果您看到消息框,那么您已经进入了 catch 块。如果没有,那么你没有。

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

【讨论】:

  • 我更新了代码以在 catch 块中添加额外的语句。调试器仍然不会停止这些。
【解决方案2】:

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

确切的名称必须不同,但它们会显示在智能感知上。

【讨论】:

  • 感谢您的回答。听起来你有解决方案。
【解决方案3】:

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

例如,只是

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

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

【讨论】:

  • 实际上正确地查看了您的问题(不应该在深夜进行 stackoverflow :)) - 我同意 Akash Kava 的观点。这很可能是因为错误在另一个线程中。
【解决方案4】:

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

catch (DataServiceQueryException ex)
 {
ex.Message
}

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 2020-11-16
    • 2010-11-25
    • 2012-02-24
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多