Ich habe ein ziemlich seltsames Problem, das auftritt.
Das ist mein Code:
private async Task BreakExpectedLogic()
{
bool test = false;
if (test == true)
{
Console.WriteLine("Hello!");
throw new Exception("BAD HASH!");
}
}
Scheint wirklich einfach, es sollte nicht das Console.WriteLine
oder das treffen throw
. Aus irgendeinem Grund trifft es immer die throw
.
Wenn ich das throw
in eine eigene Methode verschiebe, funktioniert es einwandfrei. Meine Frage ist, wie es ist, den if
Block zu ignorieren und das zu treffen throw new Exception
:
BEARBEITEN 1: Ich habe meinen Code so aktualisiert, dass er die Signatur enthält. Ich habe alles entfernt, was nicht mit diesem Problem zusammenhängt, und es ausgeführt. Es passiert immer noch.
c#
.net
visual-studio
.net-core
George
quelle
quelle
Main
und ... Überraschung, norepro eingefügt. Entweder Sie irren sich oder Sie haben ein wichtiges Detail übersehen.async
zufällig eine Methode? Weil es ähnlich zu stackoverflow.com/questions/42528458/…Antworten:
Es scheint der Fehler in der
async
Methode zu sein, der Code wird nicht tatsächlich ausgeführt, sondern der Debugger geht mit derthrow
Anweisung in die Zeile . Wenn einige Codezeilen vorhanden sind, bevor diethrow
Anweisung inif
diesen Zeilen ignoriert wird, wechselt der Debugger nur zu der Zeile mit derthrow
Anweisung.Wenn Sie keine Variablen verwenden -
if (false)
oderif (true == false)
dann Debugger-Schritte zur richtigen Codezeile -, wird die schließende geschweifte Klammer verwendet.Dieser Fehler wurde von @Matthew Watson im Visual Studio-Team veröffentlicht (Link ist derzeit nicht verfügbar).
Siehe auch ähnliche Frage - Bedingungsprüfung in asynchroner Methode
BEARBEITEN (06.10.2017):
Das Problem kann in VS 2017 15.3.5 mit .Net Framework 4.7 nicht reproduziert werden. Das VS-Team hat dieses Problem anscheinend behoben.
quelle
Nur ein Nachtrag zur Antwort. Ich bin kürzlich auf dasselbe Problem gestoßen und habe mir den tatsächlichen x86-Code im Debugger angesehen. Er wurde auf seltsame Weise wie folgt generiert (vereinfacht):
Anstatt direkt zu den letzten Anweisungen der Methode zu springen, wird ein Doppelsprung ausgeführt, bei dem der zweite bedingungslose Sprung meines Erachtens fälschlicherweise als Teil des Codes innerhalb des
if
Blocks erkannt wird .Ich würde also spekulieren, dass dieser Fehler mit dem JIT-Compiler zusammenhängt.
quelle