If (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:

Вот некоторые доказательства

РЕДАКТИРОВАТЬ 1: я обновил свой код, чтобы включить подпись, я удалил все, что не связано с этой проблемой и запустил его, это все еще происходит.

Джордж
источник
5
@TimSchmelter: изображение отлаживается, желтая подсветка - там, где находится код
Джордж
5
Я только что создал пустое основное консольное приложение, вставил только ваш код в Mainи ... сюрприз, norepro. Либо вы ошибаетесь, либо упустили какую-то важную деталь.
Jamiec
16
Это в asyncметоде случайно? Потому что это похоже на stackoverflow.com/questions/42528458/…
Мэтью Уотсон
7
@ Джордж: до сих пор нет доказательств, потому что вы можете использовать старые символы отладки. Перекомпилируйте в режиме отладки и начните снова.
Тим
4
@TimSchmelter Я перекомпилировал, почистил, открыл заново проект попробовал разные способы выполнения if, но все тот же
George

Ответы:

176

Кажется, это ошибка в asyncметоде, код фактически не выполняется, но отладчик переходит к строке с throwоператором. Если есть несколько строк кода перед throwоператором внутри ifэтих строк игнорируются, отладчик переходит только к строке с throwоператором.

Кроме того, если вы не используете переменную - if (false)или if (true == false)затем шаги отладчика к правильной строке кода - к закрывающей фигурной скобке.

@Matthew Watson опубликовал эту ошибку для команды Visual Studio (ссылка недоступна).

Также смотрите аналогичный вопрос - Проверка состояния в асинхронном методе

РЕДАКТИРОВАТЬ (2017/10/06):

Проблема не может быть воспроизведена в VS 2017 15.3.5 с использованием .Net Framework 4.7. Похоже, команда VS исправила эту проблему.

Роман Доскоч
источник
20
Спасибо, не зная, что это ошибка в отладчике, я бы, вероятно, сошел с ума.
Джордж
121
Ошибка в отладчике? Как очень мета. :) (пение, я никогда не мета баг, как это раньше ... )
Симба
3
@ Джордж Я надеюсь, что вы не возражаете, я взял ваш образец и создал консольное приложение, используя его, и приложил его к проблеме VS, с которой связана Рома.
Обсидиановый Феникс,
5
@ Симба: Скажите, что вы никогда не использовали отладчик для отладки.
Джошуа
3
Хм. Кажется, ошибка может быть в отладочной информации, сгенерированной компилятором, а не в самом отладчике. Я подожду, пока MS подтвердит ошибку подключения, прежде чем голосовать за или против.
Адриан Маккарти
10

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

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

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

Поэтому я бы предположил, что эта ошибка может быть связана с JIT-компилятором.

Серж Семенов
источник