Je faisais des tests unitaires sur le code qui pourrait jeter un certain nombre d'exceptions selon les entrées. J'ai donc essayé quelque chose comme le code ci-dessous: (simplifié pour l'exemple)
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();
}
Mais ce sera toujours imprimer "Pris d'exception générale", le catch(T tex) gestionnaire ne marchera jamais. Il n'a pas d'importance si je jette T() ou explicitement jeter ArgumentException(). Toutes les idées de pourquoi il en est? En fait j'ai été un peu surpris de voir que j'ai même été en mesure d'utiliser T dans la clause catch, mais depuis que c'est possible de ne pas ce travail? Ou au moins de donner un compilateur d'avertissement/d'erreur qui dit que ce gestionnaire ne marchera jamais?
Mon environnement est Visual Studio 2008 et 3.5 est la cible de cadre.
Mise à JOUR: j'ai essayé maintenant directement à partir de l'invite de commande et puis il imprime "Pris adopté dans le type d'exception". Donc il semble que c'est limité à l'exécution de Visual Studio. Peut-être une particularité du processus d'hébergement Visual Studio?