¿Por qué no puedo atrapar una excepción genérica en C #?

Estaba haciendo algunas pruebas unitarias en el código que podría arrojar una serie de excepciones dependiendo de las entradas. Así que probé algo como el siguiente código: (simplificado para el ejemplo)

static void Main(string[] args) { RunTest(); } static void RunTest() 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 imprimirá “excepción general atrapada “, el controlador catch (T tex) nunca 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 comstackdor 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 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?

Comportamiento extraño aquí …

Aplicación de consola VS2k8. El seguimiento:

 try { throw new T(); } catch (T tex) { Console.WriteLine("Caught passed in exception type"); } catch (Exception ex) { Console.WriteLine("Caught general exception"); } 

resultados en “excepción general atrapada” .

Pero elimine las variables (inútiles) de las declaraciones catch:

 try { throw new T(); } catch (T) { Console.WriteLine("Caught passed in exception type"); } catch (Exception) { Console.WriteLine("Caught general exception"); } 

resultados en “Atrapado pasado en tipo de excepción” !!!


Actualización :

Heheh … Es un error: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362422&wa=wsignin1.0

¿Fuente? Aquí. ¿Por qué el comportamiento del bloque de manejo catch (TException) difiere bajo el depurador después de instalar Visual Studio 2008?

Funciona sin Depuración

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0b0e5bc9-fab2-45b1-863b-40abae370475

Solución fea (puede agregar #if DEBUG):

  try { throw new T(); } catch (Exception dbgEx) { T ex = dbgEx as T; if (ex != null) { Console.WriteLine(ex.Message); } } 

Parecería que el tipo más específico de la excepción, cuando se le da la opción entre T y Excepción, es una excepción, por lo que se invoca ese controlador.

Intenté esto (no puedes hacerlo en C # o VB, pero edité el IL), y cambié la segunda cláusula catch para capturar Object Ex en lugar de Exception Ex, y en ese caso, el primer controlador fue golpeado.

Editar

Como han señalado otros, se trata más de ejecutarlo en el depurador que del tipo específico