Якщо (false == true) виконується блок, коли кидання винятку знаходиться всередині


152

У мене досить дивна проблема, яка виникає.

Це мій код:

private async Task BreakExpectedLogic()
{
    bool test = false;
    if (test == true)
    {
        Console.WriteLine("Hello!");
        throw new Exception("BAD HASH!");
    }
}

Здається, дуже просто, він не повинен потрапляти на Console.WriteLineабо throw. Чомусь це завжди вражає throw.

Якщо я перейду throwна свій власний метод, то він прекрасно працює. Моє запитання, як це ігнорувати ifблок і натискати на throw new Exception:

Ось кілька доказів

EDIT 1: Я оновив свій код, щоб включити підпис, я видалив усе, що не пов’язано з цією проблемою, і запустив його, воно все ще відбувається.


5
@TimSchmelter картинка це її налагодження, жовта родзинка - там, де знаходиться код
Джордж

5
Щойно я створив пусту основну консольну програму, вставив лише ваш код у Mainі .... сюрприз, norepro. Або ви помиляєтесь, або пропустили якусь важливу деталь.
Jamiec

16
Це asyncвипадково в методі? Тому що це схоже на stackoverflow.com/questions/42528458/…
Меттью Уотсон

7
@George: досі немає доказів, оскільки ви можете використовувати старі символи налагодження. Перекомпілюйте в режимі налагодження та запустіть знову.
Тім Шмелтер

4
@TimSchmelter Я перекомпілював, очистив, знову відкрив проект, спробував різні способи виконання if, але все одно те саме
Джордж

Відповіді:


176

Це, здається, помилка в asyncметоді, код насправді не виконується, але налагоджувальні кроки до рядка з throwоператором. Якщо є деякі рядки коду, перш ніж throwоператор у ifцих рядках ігнорується, налагоджувальні кроки виконуються лише до рядка з throwоператором.

Крім того, якщо ви не використовуєте змінні - if (false)або if (true == false)потім налагоджувальні кроки до правильного рядка коду - до закритого фігурного дужка.

Цю помилку @Matthew Watson опублікувала команда Visual Studio (посилання зараз недоступне).

Також див. Подібне запитання - Перевірка стану в методі асинхронізації

EDIT (2017/10/06):

Випуск неможливо відтворити в VS 2017 15.3.5 за допомогою .Net Framework 4.7. Схоже, ця команда вирішила цю проблему.


20
Дякую, не знаючи, що це помилка в налагоджувальній машині, я, швидше за все, зійшов з розуму.
Джордж

121
Помилка у відладчику? Як дуже мета. :) (співаю, що я ніколи не мета-баг так, як раніше ... )
Сімба

3
@George Я сподіваюся, що ви не заперечуєте, я взяв ваш зразок і створив консольний додаток, використовуючи його, і додав його до проблеми VS, з яким романи пов’язані.
Обсидіан Фенікс

5
@Simba: Скажіть мені, що ви ніколи не використовували налагоджувач для налагодження себе.
Джошуа

3
Хм. Здається, помилка могла знаходитись у інформації про налагодження, що генерується компілятором, а не в самому відладчику. Я зачекаю, коли MS визнає помилку Connect перед голосуванням вгору або вниз.
Адріан Маккарті

10

Просто доповнення до відповіді, я нещодавно зіткнувся з тим же питанням і подивився на власне код x86 у відладчику, і він генерувався дивним чином, як це (спрощено):

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret

Тож замість прямого переходу до останніх інструкцій методу він робить подвійний стрибок, де я вважаю, що другий безумовний стрибок помилково визнається частиною коду всередині ifблоку.

Тому я б міркував, що ця помилка може бути пов’язана з компілятором JIT.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.