Tengo un problema divertido en el que durante el apagado de la aplicación, los bloques try/catch se ignoran aparentemente en la pila.¿Cuándo es un try catch no un try catch?
No tengo un proyecto de prueba en funcionamiento (sin embargo, debido a la fecha límite, de lo contrario, intentaría reproducirlo totalmente), pero considere el siguiente fragmento de código.
class IndexNotFoundException : Exception { }
public static string RunAndPossiblyThrow(int index, bool doThrow)
{
try
{
return Run(index);
}
catch(IndexNotFoundException e)
{
if(doThrow)
throw;
}
return "";
}
public static string Run(int index)
{
if(_store.Contains(index))
return _store[index];
throw new IndexNotFoundException();
}
public static string RunAndIgnoreThrow(int index)
{
try
{
return Run(index);
}
catch(IndexNotFoundException e)
{
}
return "";
}
Durante el tiempo de ejecución, este patrón funciona estupendamente. Obtenemos soporte heredado para código que se basa en excepciones para control de programa (mal) y podemos seguir adelante y eliminar lentamente las excepciones utilizadas para el control de programa.
Sin embargo, al cerrar nuestra interfaz de usuario, vemos una excepción lanzada desde "Ejecutar" aunque "doThrow" es falso para TODOS los usos actuales de "RunAndPossiblyThrow". Incluso llegué a verificar esto modificando el código para que pareciera "RunAndIgnoreThrow" y sigo teniendo un cierre de la UI de la publicación de la falla.
Sr. Eric Lippert, leo su blog a diario, me encantaría escuchar que se trata de un error conocido y no me estoy volviendo loco.
EDITAR Esta es multi-hilo, y he verificado todos los objetos no se modifican mientras se accede
EDITAR explícitamente muestran excepción es la nuestra
EDITAR se olvidó de mencionar, esto es en el cierre y, lamentablemente, Visual Studio no puede detectar el bloqueo directamente. Es probable que falle en un hilo que no sea el de la interfaz de usuario, y una vez que se cierra, este se cierra. Solo pude depurar esto ejecutando repetidamente & cerrando la aplicación, con el administrador de tareas abierto, "Crear archivo volcado" y mirando el desorden resultante de 400 mb en Windbg. Win7 64 para referencia. Asegúrate de que esto tenga sentido para ti.
EDITAR
El siguiente código al cerrar el sistema sigue mostrando la misma excepción.
class IndexNotFoundException : Exception { }
public static string RunAndPossiblyThrow(int index, bool doThrow)
{
try
{
return Run(index);
}
catch
{
}
return "";
}
public static string Run(int index)
{
if(_store.Contains(index))
return _store[index];
throw new IndexNotFoundException();
}
La única cosa que parece deshacerse de la excepción es ir directamente a
class IndexNotFoundException : Exception { }
public static string RunAndPossiblyThrow(int index, bool doThrow)
{
try
{
return Run(index);
}
catch
{
}
return "";
}
public static string Run(int index)
{
if(_store.Contains(index))
return _store[index];
return "";
}
Naturalmente la excepción se ha ido, pero mis temor a volverse loco todavía están presentes.
EDITAR
sólo empeoró ... esto vuelve a colgarse ...
class IndexNotFoundException : Exception { }
public static string RunAndPossiblyThrow(int index, bool doThrow)
{
try
{
throw new IndexNotFoundException();
}
catch
{
}
return "";
}
EDITAR tengo una clara sensación de que esto va a conseguirme ninguna parte. Además del comportamiento extraño, también puedo observar que durante la ejecución de la IU en el caso anterior, la captura de prueba se está ejecutando fielmente. Mi interfaz de usuario no se bloquea & está lleno de cadenas vacías. Sin embargo, una vez que empiezo a cerrar la interfaz de usuario, se muestra el bloqueo y la captura de prueba ya no detiene la excepción.
EDITAR & última Al parecer, el archivo de volcado fue la inclusión en el más reciente excepción de primera oportunidad. Lo verifiqué creando un nuevo proyecto que arrojó dentro de una captura de prueba & durmió durante 10 segundos. Durante la espera obtuve el.dmp archivo &, mi excepción completamente atrapada estaba apareciendo.
voy a marcar algunos puntos para las respuestas útiles, sin embargo, lamentablemente todavía no hay rima o razón por la que mi código está fallando ...
¿Se puede publicar la información de la excepción? ¿Seguimiento de pila, tipo de excepción, mensaje, etc.? – Jake
La excepción es una excepción IndexNotFound de plano-jane que hemos creado en nuestro proyecto. No se arroja nada del código administrado, es nuestra excepción y nuestra pila como se describe en la pregunta. Voy a actualizar la pregunta. – Dearmash
¿Este "bloqueo" es en realidad un mensaje de excepción, con un seguimiento de pila, o es un diálogo de bloqueo de Windows? – Aaronaught