Estaba haciendo algunas pruebas unitarias en el código que podría arrojar una serie de excepciones dependiendo de las entradas. Así que he intentado algo así como el código de abajo: (simplificado para el ejemplo)¿Por qué no puedo atrapar una excepción genérica en C#?
static void Main(string[] args)
{
RunTest<ArgumentException>();
}
static void RunTest<T>() where T : Exception, new()
{
try
{
throw new T();
//throw new ArgumentException(); <-- Doesn't work either
}
catch (T tex)
{
Console.WriteLine("Caught passed in exception type");
}
catch (Exception ex)
{
Console.WriteLine("Caught general exception");
}
Console.Read();
}
Pero esto siempre se imprimirá "excepción general Atrapados", la captura (T tex) manejador no va a funcionar. No importa si lanzo T() o lanzo explícitamente ArgumentException(). ¿Alguna idea de por qué es esto? En realidad, estaba un poco sorprendido de que incluso pudiera usar T en la cláusula catch, pero como eso es posible, ¿no debería funcionar? ¿O al menos dar un error/advertencia del compilador que diga que este controlador nunca funcionará?
Mi entorno es Visual Studio 2008 y 3.5 es el marco de destino.
ACTUALIZACIÓN: Lo intenté ahora directamente desde el símbolo del sistema y luego se imprime "Atrapado pasado en tipo de excepción". Por lo tanto, parece que esto está restringido para ejecutarse desde Visual Studio. ¿Tal vez una peculiaridad del proceso de alojamiento de Visual Studio?
Acabo de prueba en LINQPad y se imprime Caught pasado en el tipo de excepción. ¿Puede dar más detalles de su entorno y la versión del marco? –
Eso es interesante. Lo ejecuté como una aplicación de consola en VS2008 e imprimí una excepción general de Caught. –
También funciona en la aplicación de consola SnippetCompiler –