异常发生后代码如何执行?

6
我一定是遗漏了什么...即使在调试器中抛出异常,为什么异常后面的代码仍然会被执行?
private UpdaterManifest GetUpdaterManifest()
{
    string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest");

    if (!File.Exists(filePathAndName))
    {
        // This line of code gets executed:
        throw new FileNotFoundException("The updater manifest file was not found. This file is necessary for the program to run.", filePathAndName);
    }

    UpdaterManifest updaterManifest;

    using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open))
    {
        // ... so how is it that the debugger stops here and the call stack shows
        // this line of code as the current line? How can we throw an exception
        // above and still get here?
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(UpdaterManifest));
        updaterManifest = xmlSerializer.Deserialize(fileStream) as UpdaterManifest;
    }

    return updaterManifest;
}

1
也许你可以在更高层次的代码中捕获异常? - Andreas Eriksson
1
也许你正在查看不同的线程? - Strillo
4
我会尝试先清理并重建解决方案,同时在函数入口处添加断点(可能会被调用两次)。 - Roee Gavirel
4
你确定你正在调试的汇编代码版本与在 Visual Studio 中看到的版本相匹配吗?也许调试器只是有“旧”的行号(你可能删除了一些行),因此显示错误的行数? - yas4891
1
确认一下 - 异常信息是“未找到更新程序清单文件...”吗?如果是,那么很可能只是IDE的行数出了问题... - Marc Gravell
显示剩余9条评论
1个回答

5
一些可能发生这种情况的场景:
  • 当选项“要求源文件与原始版本完全匹配”关闭时。在这种情况下,如果您的文件不同步,您将不会收到警告。

  • 当IDE要求“有构建错误。您是否要继续并运行上次成功的构建?”时,此时IDE可能会错误地显示正确的行,因为它运行的是早期版本。

  • 当您调试代码的发布版本时,其中某些部分被优化掉。这导致突出显示的行是源代码中反映和实际语句的下一行(在使用已经过优化的外部程序集进行调试时,您经常会看到这种情况)。


编辑:我有点误读了您的代码。在“throw”和被突出显示的行之间,只有一个变量的声明,没有任何要执行的代码。我假设您的意思是突出显示了“using…”这段代码?因为这是预期的:它是throw语句之后的第一行(throw语句本身不会“捕获”调试器的错误)。

请参见屏幕截图: enter image description here


1
已勾选“需要源文件…”。同时,没有构建错误。我没有调试发布版本。这最终会变成一些愚蠢的事情,我本应该知道,但现在我卡住了。 - Bob Horn
谢谢,Abel。当我在throw语句上按F10时,我期望catch块是下一行显示的。就像Marc说的那样,可能只是IDE错了一行。我的异常看起来和你上面展示的完全一样。一旦我到达那个点后按下F10,我正确地进入到catch块中。 - Bob Horn
2
@BobHorn:你应该这样看待它:调试器会在每次抛出异常时中断程序,并在抛出异常后的语句处停止(通常是回溯到的那一行)。你可以通过勾选“仅在用户未处理的异常上中断”(或取消此特定异常的复选框)并在catch子句中添加手动断点来解决此问题。 - Abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接