try - Warum kann ich eine generische Ausnahme in C#nicht abfangen?




manually throw exception c# (2)

Ich habe einen Unit-Test mit Code durchgeführt, der abhängig von den Eingaben eine Reihe von Ausnahmen auslösen kann. Also habe ich etwas wie den folgenden Code versucht: (vereinfacht für das Beispiel)

    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 "Ausgenommen allgemeine Ausnahme" ausgeben, der Catch (T tex) Handler wird niemals 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 an der Eingabeaufforderung 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?


Bizarres Verhalten hier ...

VS2k8 Konsolen App. Folgende:

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

Ergebnisse in "Generalausnahme abgefangen" .

Aber entfernen Sie die (nutzlosen) Variablen aus den catch-Anweisungen:

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

Ergebnisse in "Caught bestanden in Ausnahmeart" !!!

Aktualisierung :

Heheh ... Es ist ein Bug: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=362422&wa=wsignin1.0

Quelle? Hier. Warum unterscheidet sich das Verhalten des Verhaltens von catch (TException) im Debugger nach der Installation von Visual Studio 2008?






exception-handling