У меня довольно странная проблема, которая происходит.
Это мой код:
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: я обновил свой код, чтобы включить подпись, я удалил все, что не связано с этой проблемой и запустил его, это все еще происходит.
c#
.net
visual-studio
.net-core
Джордж
источник
источник
Main
и ... сюрприз, norepro. Либо вы ошибаетесь, либо упустили какую-то важную деталь.async
методе случайно? Потому что это похоже на stackoverflow.com/questions/42528458/…Ответы:
Кажется, это ошибка в
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 исправила эту проблему.
источник
Просто дополнение к ответу, я недавно столкнулся с той же проблемой и посмотрел на фактический код x86 в отладчике, и он был сгенерирован таким странным образом (упрощенно):
Таким образом, вместо прямого перехода к последним инструкциям метода, он выполняет двойной переход, где я считаю, что второй безусловный переход ошибочно распознается как часть кода внутри
if
блока.Поэтому я бы предположил, что эта ошибка может быть связана с JIT-компилятором.
источник