Vraag Als (false == true) het blok uitvoert wanneer het werpen van de uitzondering binnen is


Ik heb een nogal vreemd probleem dat zich voordoet.

Dit is mijn code

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

Het lijkt heel simpel, het mag de Console.WriteLine of de throw. Om de een of andere reden raakt het altijd de throw.

Als ik de throw in zijn eigen methode werkt het prima. Mijn vraag is hoe het de. Negeert if blokkeren en raken van de throw new Exception

Here is some evidence

EDIT 1 Ik heb mijn code bijgewerkt met de handtekening, ik heb alles verwijderd dat niet gerelateerd is aan dit probleem en heeft het uitgevoerd, het gebeurt nog steeds


147
2018-03-02 10:37


oorsprong


antwoorden:


Het lijkt de bug te zijn async methode, de code is niet daadwerkelijk uitgevoerd, maar debugger-stappen naar de regel met throw uitspraak. Als er eerder regels code zijn throw verklaring binnen if deze regels worden genegeerd, stappen voor debugger enkel en alleen naar de regel met throw uitspraak.

Ook als u geen variabele gebruikt - if (false) of if (true == false) vervolgens debugger stappen om de juiste regel van de code - om de sluitende accolade.

Deze bug is gepost door @Matthew Watson naar Visual Studio-team (link is nu niet beschikbaar).

Zie ook soortgelijke vraag - Conditiecontrole in async-methode

EDIT (2017/10/06):

Probleem kan niet worden gereproduceerd in VS 15.3.5 met behulp van .Net Framework 4.7. Het lijkt erop dat VS-team dit probleem heeft opgelost.


171
2018-03-02 10:44



Gewoon een addendum bij het antwoord, ik ben onlangs hetzelfde probleem tegengekomen en keek naar de eigenlijke x86-code in de foutopsporing en deze werd op een vreemde manier als volgt (vereenvoudigd) aangemaakt:

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

Dus in plaats van direct naar de laatste instructies van de methode te springen, springt het dubbel omhoog, waarbij ik geloof dat de tweede onvoorwaardelijke sprong ten onrechte wordt herkend als een deel van de code binnenin if blok.

Dus ik zou speculeren dat deze bug gerelateerd zou kunnen zijn aan de JIT-compiler.


8
2018-03-09 16:06