Почему отладчик срабатывает по умолчанию? - PullRequest
4 голосов
/ 14 января 2020

У какого-то коллеги возникла очень странная проблема отладки, в которой он переходит через переключатель, переходит к некоторому случаю, но все же после этого он затрагивает также случай по умолчанию. Я понятия не имею, как это может произойти!

Это легко воспроизводимо, и я наконец-то извлек код в небольшой тест.

Если поставить точку останова только для случая по умолчанию, то отладчик никогда не остановится на этом. Но если я добавлю точку останова в случае 42, а затем использую команду step over, то она попадет в случай по умолчанию !! Обратите внимание, что улов никогда не достигается, хотя. Таким образом, кажется, что отладчик показывает то, чего на самом деле не происходит? Кроме того, если я удаляю задачу asyn c и жду, тогда это не произойдет .. Нам также нужен другой случай, который объявляет переменную (что-то причудливое, а не простое целое число и т. Д. c ..)

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

GIF, созданный Синатром для иллюстрации топи c, спасибо! the issue onhand

1 Ответ

0 голосов
/ 14 января 2020

Вы использовали метод DoSomething неправильно. Ключевое слово ASYN C означает, что у вас есть вызов await где-то внутри метода (чтобы получить точку возврата позже после завершения задачи), но у вас его нет. Ваше странное поведение отладчика связано с реализацией. Ваше исключение не брошено на самом деле. Я воспроизвел ваш случай, и конструктор MyException просто игнорируется / пропускается отладчиком, и код в секции catch (Exception ex c) также никогда не вызывается. Или, если у меня перерыв в 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)
            {
            }
        }
...