繁体   English   中英

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

[英]Visual Studio: edit-and-continue on handled exceptions?

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

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

对于从VS2008开始的任何VS,其行为都是相同的(未在较早版本上进行检查)。

如果在调试下(使用标准调试设置)运行它,则在修复代码(使用EnC)之前,不允许继续运行。 由于[DebuggerHidden]和“在未处理的异常上展开堆栈”设置组合(默认情况下启用了该设置),因此按F5只会重新运行断言。

要修复代码,只需将#1行替换为object x = "" ,为其设置下一条语句,然后再次按F5。

现在,为ArgumentNullException启用“抛出时中断”,并取消标记为#2的行的注释。 行为发生了变化:您再次在断言时停止,但是堆栈不会展开(可通过CallStack窗口轻松检查)。 F5将从引发异常的地方继续。

好的,所以...现在的问题是:在打破处理的异常时,有什么方法可以启用自动堆栈展开功能吗?

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

UPD:要澄清一个问题:我想断言失败的行,用edit编辑代码,然后继续,将next语句设置为固定代码,然后继续执行。

如果异常未在堆栈中捕获,则可以正常工作。

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

并取消注释标记为#2的行

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

并且必须由CLR进行平仓,调试器没有选项可以在您要求的第一次机会异常中断时执行。 而且SetNext在那时无法正常工作。 如果我正确地解释了这个问题,那么您真的很想拥有,因为接下来您需要做的是忙碌的工作,单步执行catch块并不会带来很大的乐趣。

尽管尚未实施,但我认为它在技术上是可行的。 但这仅仅是因为我非常高兴地不知道调试器团队将要做多少工作。 使E + C更好地工作是一个很好的要求,您可以在此处提出 将URL发布到您的提案中作为一个好主意,很可能会赢得很多选票。 我会投票。

为了澄清这个问题:我想断言失败的行,用edit编辑代码,然后继续,将next语句设置为固定代码,然后继续执行。

  1. 打开“例外设置”菜单(“调试”>“ Windows”>“例外设置”)
  2. 在“公共语言运行时异常”下,选中“ System.ArgumentNullException”框。 (或者全部检查,无论您要寻找什么。)

现在,无论何时抛出System.ArgumentNullException ,它都应该中断,无论是否将其捕获在catch块中。

但是, 您不能编辑和继续活动语句 如果您尝试修改断言行,则会看到类似以下内容的内容:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM