簡體   English   中英

為什么調試器會遇到默認情況?

[英]Why does the debugger hit the default case?

一些同事遇到了一個非常奇怪的調試問題,他單步執行開關,單步執行某些情況,但隨后又遇到了默認情況。 我不知道這怎么會發生!

它很容易重現,我終於將代碼提取到一個小測試中。

如果我只在默認情況下設置斷點,那么調試器將永遠不會停在那里。 但是如果我在case 42處加一個斷點,然后使用step over,它之后會碰到default case!! 請注意,盡管從未達到過捕獲。 所以調試器似乎顯示了一些實際上沒有發生的事情? 另外,如果我刪除異步任務並等待,那么它就不會發生..我們還需要另一個聲明變量的案例(花哨的東西,而不是簡單的整數等。)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM