Visual Studio:编辑并继续处理异常?

Sin*_*nix 10 c# debugging visual-studio

这是一个代码,重现了我期望获得的行为:

    static void Main(string[] args)
    {
        // try // #2
        {
            string x = null; // #1
            AssertNotNull(x, nameof(x));
        }
        // catch (ArgumentNullException) { } // #2
        Console.WriteLine("Passed.");
        Console.ReadKey();
    }

    [DebuggerHidden]
    public static void AssertNotNull<T>(T arg, string argName) where T : class
    {
        if (arg == null)
            throw new ArgumentNullException(argName);
    }
Run Code Online (Sandbox Code Playgroud)

从VS2008开始的任何VS的行为都是相同的(没有检查早期版本).

如果在调试下运行它(使用标准调试设置),则在修复代码(使用EnC)之前不允许继续.点击F5将重新运行断言,因为[DebuggerHidden]和"Unwind stack on unhandled exception"设置组合(默认情况下启用设置).

要修复代码,只需将#1行替换为object x = "",将下一个语句设置为它并再次点击F5.

现在,为ArgumentNullException启用"thrown thrown"并取消注释标记为#2的行.行为改变:你再次断言断言,但堆栈没有解除(很容易用CallStack窗口检查).F5将从抛出异常的地方继续.

好的,所以...现在的问题是:在打破处理的异常时,有没有办法启用自动堆栈展开?

隐藏VS选项,现有扩展或(可能)API可以在我自己的扩展中使用?

UPD:澄清一个问题:我想在断言失败的情况下中断,用编辑编辑代码并继续,将next语句设置为固定代码并继续执行.

如果异常没有被捕获到堆栈,它可以正常工作.

UPD2由Hans Passant提出:在UserVoice上发表了一条建议.随意投票:)

Han*_*ant 3

并取消注释#2 标记的行

这是你问题的关键部分。您改变了不止一件事,关键的改变是您改变了堆栈的展开方式。您喜欢的调试器选项的标题是“在未处理的异常上展开堆栈”。问题是,不再有未处理的异常。您的 catch 子句会处理它,现在由 CLR 展开堆栈。

并且必须由 CLR 执行展开,调试器没有选项在您要求的第一次异常中断时执行此操作。此时 SetNext 就无法工作了。如果我正确地解释了这个问题,你真的很想拥有这个,因为你下一步需要做的是繁忙的工作,单步执行 catch 块并不是巨大的乐趣。

虽然没有实现,但我认为技术上是可行的。但这只是因为我幸福地不知道调试器团队需要做多少工作。这是一个让 E+C 更好地工作的好请求,您可以在这里提出。将您的提案的 URL 作为评论发布,很有可能获得大量选票。我会投票支持它。