Tengo un problema bastante extraño que está ocurriendo.
Este es mi código:
private async Task BreakExpectedLogic()
{
bool test = false;
if (test == true)
{
Console.WriteLine("Hello!");
throw new Exception("BAD HASH!");
}
}
Parece realmente simple, no debería golpear el Console.WriteLine
o el throw
. Por alguna razón, siempre está golpeando el throw
.
Si muevo throw
a su propio método, entonces funciona bien. Mi pregunta es cómo ignora el if
bloque y golpea el throw new Exception
:
EDITAR 1: He actualizado mi código para incluir la firma, he eliminado todo lo que no está relacionado con este problema y lo ejecuté, todavía sucede.
c#
.net
visual-studio
.net-core
Jorge
fuente
fuente
Main
y ... sorpresa, norepro. O te equivocas o te has perdido algunos detalles importantes.async
método por casualidad? Porque parece similar a stackoverflow.com/questions/42528458/…Respuestas:
Parece ser el error en el
async
método, el código no se ejecuta realmente, pero los pasos del depurador a la línea con lathrow
declaración. Si hay algunas líneas de código antes de que se ignore lathrow
declaración dentro deif
estas líneas, el depurador solo avanza a la línea con lathrow
declaración.Además, si no utiliza la variable,
if (false)
oif (true == false)
luego los pasos del depurador en la línea de código correcta, en la llave de cierre.Este error ha sido publicado por @Matthew Watson al equipo de Visual Studio (el enlace no está disponible ahora).
También, vea una pregunta similar - Verificación de condición en método asíncrono
EDITAR (2017/10/06):
El problema no se puede reproducir en VS 2017 15.3.5 con .Net Framework 4.7. Parece que el equipo VS ha solucionado este problema.
fuente
Solo un apéndice a la respuesta, recientemente encontré el mismo problema y busqué el código x86 real en el depurador, y se generó de una manera extraña como esta (simplificado):
Entonces, en lugar de saltar directamente a las últimas instrucciones del método, hace doble salto, donde creo que el segundo salto incondicional se reconoce erróneamente como parte del código dentro del
if
bloque.Entonces, especularía que este error podría estar relacionado con el compilador JIT.
fuente