Ich habe einige Unit-Tests mit Code durchgeführt, der abhängig von den Eingaben eine Reihe von Ausnahmen auslösen kann. Also habe ich versucht, so etwas wie den folgenden Code: (für das Beispiel vereinfacht)Warum kann ich eine generische Ausnahme in C# nicht abfangen?
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();
}
Aber das wird immer auszudrucken "Caught allgemeine Ausnahme", die catch (T tex) Handler wird nie funktionieren. Es spielt keine Rolle, ob ich T() werfe oder explizit ArgumentException() werfe. Irgendwelche Ideen, warum das ist? Tatsächlich war ich irgendwie überrascht, dass ich T sogar in der Fangklausel verwenden konnte, aber da das möglich ist, sollte das nicht funktionieren? Oder geben Sie zumindest eine Compiler-Warnung/einen Fehler, der besagt, dass dieser Handler niemals funktionieren wird?
Meine Umgebung ist Visual Studio 2008 und 3.5 ist das Zielframework.
UPDATE: Ich habe es jetzt direkt von der Eingabeaufforderung aus versucht und dann "Caught passed in exception type" ausgedruckt. Es scheint also so zu sein, dass dies nur von Visual Studio aus möglich ist. Vielleicht eine Besonderheit des Visual Studio Hosting-Prozesses?
Getestet habe ich es nur in LinqPad zu tun und es ausgedruckt in Ausnahmetyp weitergegeben Erwischt. Können Sie mehr Details zu Ihrer Umgebung und Framework-Version angeben? –
Das ist interessant. Ich habe es als eine Konsole App in VS2008 ausgeführt und es gedruckt allgemeine Ausnahmebedingung gedruckt. –
Funktioniert auch in SnippetCompiler –