2009-10-16 2 views
39

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?

+1

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? –

+2

Das ist interessant. Ich habe es als eine Konsole App in VS2008 ausgeführt und es gedruckt allgemeine Ausnahmebedingung gedruckt. –

+0

Funktioniert auch in SnippetCompiler –

Antwort

32

Bizarres Verhalten hier ...

VS2k8 Konsole App. Die 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 "Caught allgemeine Ausnahme".

Aber die (nutzlosen) Variablen aus den Fangmeldungen entfernen:

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

Ergebnisse in "in Ausnahmetyp bestand gefangen" !!!


aktualisieren:

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

Source? Hier. Why does catch(TException) handling block behaviour differ under the debugger after installing Visual Studio 2008?

2

Es scheint, dass die spezifische Art der Ausnahme, wenn gegeben Die Auswahl zwischen T und Exception ist eine Ausnahme und daher wird der Handler aufgerufen.

Ich habe gerade versucht dies (Sie können es nicht in C# oder VB, aber ich bearbeitete die IL) und änderte die zweite catch-Klausel, um Objekt Ex statt Exception Ex zu fangen, und in diesem Fall der erste Handler würde getroffen.

bearbeiten

Wie andere haben darauf hingewiesen, es ist mehr mit fliessendem es im Debugger als die spezifische Art

Verwandte Themen