J'ai un problème assez étrange qui se produit.
Voici mon code:
private async Task BreakExpectedLogic()
{
bool test = false;
if (test == true)
{
Console.WriteLine("Hello!");
throw new Exception("BAD HASH!");
}
}
Cela semble vraiment simple, il ne devrait pas toucher le Console.WriteLine
ou le throw
. Pour une raison quelconque, il frappe toujours le throw
.
Si je déplace le throw
dans sa propre méthode, cela fonctionne bien. Ma question est de savoir comment ignorer le if
bloc et frapper le throw new Exception
:
EDIT 1: J'ai mis à jour mon code pour inclure la signature, j'ai supprimé tout ce qui n'est pas lié à ce problème et l'ai exécuté, cela se produit toujours.
c#
.net
visual-studio
.net-core
George
la source
la source
Main
et .... surprise, norepro. Soit vous vous trompez, soit vous avez manqué un détail important.async
méthode par hasard? Parce qu'il semble similaire à stackoverflow.com/questions/42528458/...Réponses:
Cela semble être le bogue de la
async
méthode, le code n'est pas réellement exécuté mais le débogueur passe à la ligne avecthrow
instruction. S'il existe des lignes de code avant que l'throw
instruction à l'intérieur deif
ces lignes ne soit ignorée, le débogueur effectue uniquement des étapes jusqu'à la ligne contenant l'throw
instruction.De plus, si vous n'utilisez pas de variable -
if (false)
ouif (true == false)
alors les étapes du débogueur vers la ligne de code correcte - vers l'accolade fermante.Ce bogue a été publié par @Matthew Watson dans l'équipe Visual Studio (le lien n'est pas disponible pour le moment).
Voir également la question similaire - Vérification des conditions dans la méthode asynchrone
EDIT (2017/10/06):
Le problème ne peut pas être reproduit dans VS 2017 15.3.5 à l'aide de .Net Framework 4.7. On dirait que l'équipe VS a résolu ce problème.
la source
Juste un addendum à la réponse, j'ai récemment rencontré le même problème et j'ai regardé le code x86 réel dans le débogueur, et il a été généré d'une manière étrange comme celle-ci (simplifiée):
Donc, au lieu de sauter directement aux dernières instructions de la méthode, il fait un double saut, où je crois que le deuxième saut inconditionnel est reconnu à tort comme faisant partie du code à l'intérieur du
if
bloc.Je suppose donc que ce bogue pourrait être lié au compilateur JIT.
la source