某些同事遇到了一个非常奇怪的调试问题,在该问题中,他逐步执行开关,逐步处理某种情况,但后来也达到了默认情况。我不知道那怎么会发生!
它很容易复制,我终于将代码提取到一个小测试中。
如果仅在默认情况下设置断点,则调试器将永远不会在那里停止。但是,如果我在案例42中添加一个断点,然后使用step over,它将在之后达到默认案例!请注意,尽管从未达到捕获量。因此,似乎调试器显示的是实际未发生的事情?另外,如果我删除异步任务并等待,那么它将不会发生。我们还需要另一个声明变量的情况(有点花哨,而不是简单的整数等。)
public class Foo
{
public readonly string Bar = nameof(Bar);
}
public async Task DoSomething(int x)
{
try
{
switch (x)
{
case 43:
var foo = new Foo();
break;
case 42:
Console.WriteLine(x);
break;
default:
throw new NotImplementedException("aaarghh..");
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private async void btnSomethingTo_Click(object sender, EventArgs e)
{
await DoSomething(42);
}
由Sinatr创建的GIF,用于说明现有主题,谢谢!
您未正确使用DoSomething方法。ASYNC关键字表示您在方法内的某个位置进行了await调用(以在任务结束后稍后获得返回点),但是您还没有。您奇怪的调试器行为与实现有关。您的例外事实并非事实。我已经转载了您的情况,调试器只是忽略了[[MyException构造函数,也没有跳过它,并且从未调用过[[catch(Exception exc)]]部分中的代码。或者,如果我在CASE 42:中中断,而我只按F5,则将跳过DEFAULT部分中的断点。public async Task DoSomething(int x)
{
try
{
switch (x)
{
case 43:
var foo = new Foo();
break;
case 42:
Debug.WriteLine(x);
break;
case 44:
break;
default:
throw new MyException("aaarghh..");
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private async void button1_Click(object sender, EventArgs e)
{
await DoSomething(42);
}
public class MyException : Exception
{
public MyException(string message): base(message)
{
if (message != null)
Debug.WriteLine(message);
}
public MyException() : base()
{
}
public MyException(string message, Exception innerException) : base(message, innerException)
{
}
}