Mam dość dziwny problem, który się pojawia.
To jest mój kod:
private async Task BreakExpectedLogic()
{
bool test = false;
if (test == true)
{
Console.WriteLine("Hello!");
throw new Exception("BAD HASH!");
}
}
Wydaje się bardzo proste, nie powinno trafiać Console.WriteLine
ani w throw
. Z jakiegoś powodu zawsze uderza w throw
.
Jeśli przestawię się throw
na własną metodę, to działa dobrze. Moje pytanie brzmi: jak to jest ignorować if
blok i trafiać w throw new Exception
:
EDYCJA 1: Zaktualizowałem kod, aby zawierał podpis, usunąłem wszystko, co nie jest związane z tym problemem i uruchomiłem go, nadal się dzieje.
c#
.net
visual-studio
.net-core
Jerzy
źródło
źródło
Main
, wkleiłem tylko twój kod do i ... niespodzianka, norepro. Albo się mylisz, albo przegapiłeś jakiś ważny szczegół.async
metoda? Ponieważ wydaje się podobny do stackoverflow.com/questions/42528458/ ...Odpowiedzi:
Wydaje się, że jest to błąd w
async
metodzie, kod nie jest faktycznie wykonywany, ale debugger przechodzi do linii zthrow
instrukcją. Jeśli istnieje kilka wierszy kodu przedthrow
instrukcją wewnątrzif
tych linii, które są ignorowane, debugger przechodzi tylko do linii zthrow
instrukcją.Ponadto, jeśli nie używasz zmiennej -
if (false)
lubif (true == false)
debugera kroków do prawidłowego wiersza kodu - do zamykającego nawiasu klamrowego.Ten błąd został opublikowany przez @Matthew Watsona w zespole programu Visual Studio (łącze nie jest teraz dostępne).
Zobacz też podobne pytanie - Sprawdzanie stanu w metodzie asynchronicznej
EDYCJA (06.10.2017):
Nie można odtworzyć problemu w VS 2017 15.3.5 przy użyciu .Net Framework 4.7. Wygląda na to, że zespół VS rozwiązał ten problem.
źródło
To tylko dodatek do odpowiedzi, ostatnio napotkałem ten sam problem i spojrzałem na rzeczywisty kod x86 w debugerze i został on wygenerowany w dziwny sposób, taki jak ten (uproszczony):
Więc zamiast bezpośrednio przeskakiwać do ostatniej instrukcji metody, wykonuje podwójny skok, w którym moim zdaniem drugi bezwarunkowy skok jest błędnie rozpoznawany jako część kodu wewnątrz
if
bloku.Więc spekuluję, że ten błąd może być związany z kompilatorem JIT.
źródło