[英]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语句设置为固定代码,然后继续执行。
现在,无论何时抛出System.ArgumentNullException
,它都应该中断,无论是否将其捕获在catch
块中。
但是, 您不能编辑和继续活动语句 。 如果您尝试修改断言行,则会看到类似以下内容的内容:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.