Eu tenho um problema bastante estranho que está ocorrendo.
Este é o meu código:
private async Task BreakExpectedLogic()
{
bool test = false;
if (test == true)
{
Console.WriteLine("Hello!");
throw new Exception("BAD HASH!");
}
}
Parece realmente simples, não deve atingir o Console.WriteLine
ou o throw
. Por alguma razão, está sempre atingindo o throw
.
Se eu mover o throw
método para seu próprio método, ele funcionará bem. Minha pergunta é como ele está ignorando o if
bloco e atingindo o throw new Exception
:
EDIÇÃO 1: atualizei meu código para incluir a assinatura, removi tudo que não estava relacionado a esse problema e o executei, ainda acontece.
c#
.net
visual-studio
.net-core
George
fonte
fonte
Main
e .... surpresa, norepro. Ou você está enganado ou perdeu alguns detalhes importantes.async
método por acaso? Porque parece semelhante a stackoverflow.com/questions/42528458/…Respostas:
Parece ser o erro no
async
método, o código não é realmente executado, mas o depurador avança para a linha com athrow
instrução Se houver algumas linhas de código antes que athrow
instrução dentroif
dessas linhas seja ignorada, o depurador passará apenas para a linha comthrow
instruçãoAlém disso, se você não usar variável -
if (false)
ouif (true == false)
etapas do depurador para a linha de código correta - para a chave de fechamento.Este bug foi publicado por @Matthew Watson na equipe do Visual Studio (o link não está disponível agora).
Consulte também perguntas semelhantes - Verificação de condição no método assíncrono
EDIT (06/10/2017):
O problema não pode ser reproduzido no VS 2017 15.3.5 usando o .Net Framework 4.7. Parece que a equipe do VS corrigiu esse problema.
fonte
Apenas um adendo à resposta, encontrei recentemente o mesmo problema e olhei o código x86 real no depurador, e ele foi gerado de uma maneira estranha como esta (simplificada):
Então, em vez de pular diretamente para as últimas instruções do método, ele dá um pulo duplo, onde acredito que o segundo pulo incondicional é erroneamente reconhecido como parte do código interno
if
bloco.Então, eu especularia que esse bug possa estar relacionado ao compilador JIT.
fonte