C# 异常后代码如何执行?

C# 异常后代码如何执行?,c#,exception,visual-studio-debugging,C#,Exception,Visual Studio Debugging,我一定错过了什么。。。如何抛出异常,而异常后面的代码仍然在调试器中被命中 private UpdaterManifest GetUpdaterManifest() { string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest"); if (!File.Exists(filePathAndName)) { // This l

我一定错过了什么。。。如何抛出异常,而异常后面的代码仍然在调试器中被命中

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

在某些情况下,这种情况通常会发生:

  • 当“要求源文件与原始版本完全匹配”选项关闭时。在这种情况下,当文件不同步时不会收到警告

  • 当IDE询问“存在生成错误。是否继续并运行上次成功的生成?”时,在这种情况下,IDE可能在正确的行上出错,因为它运行的是早期版本

  • 调试代码的发布版本时,某些部分会被优化掉。这将导致高亮显示的行成为源代码中的下一个可用行,反映优化代码中的实际语句(这在使用优化的外部程序集进行调试时常见)


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

请参见屏幕截图:

也许您发现了链上更远的异常?也许您正在查看不同的线程?我会首先尝试:清理并重建解决方案。还可以在函数的输入点添加断点(可能会调用两次)。是否确定正在调试的程序集与在Visual Studio中看到的版本匹配?也许调试器只是有“旧”行号(您可能删除了一些行),因此显示了错误的行?要确认,异常消息是“未找到更新程序清单文件…”吗?如果是这样,可能只是IDE被关闭了一行…“需要源文件…”被选中。此外,没有生成错误。我没有调试发布版本。我本该知道这会是一件愚蠢的事情,但现在我被卡住了。谢谢你,亚伯。我希望catch块是在throw语句中点击F10时显示的下一行。就像马克说的,也许只是IDE出了问题。我的例外情况与您上面显示的完全相同。一旦我在该点后点击F10,我就正确地被带到catch块。@BobHorn:您应该看到这样的情况:调试器在每次抛出时都会中断,并且在抛出后立即在语句上停止(通常这是调试器展开到的行)。您可以通过选中“仅在用户未处理异常时中断”(或删除此特定异常的复选框)并在catch子句中添加手动断点来修复此问题。