调试器为什么会遇到默认情况?

问题描述 投票:4回答:1

某些同事遇到了一个非常奇怪的调试问题,在该问题中,他逐步执行开关,逐步处理某种情况,但后来也达到了默认情况。我不知道那怎么会发生!

它很容易复制,我终于将代码提取到一个小测试中。

如果仅在默认情况下设置断点,则调试器将永远不会在那里停止。但是,如果我在案例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,用于说明现有主题,谢谢!“现有问题”

c# debugging switch-statement
1个回答
-1
投票

您未正确使用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) { } }

© www.soinside.com 2019 - 2024. All rights reserved.