2010-01-08 2 views
10

Mögliche Duplizieren:
Why can’t I catch a generic exception in C#?Warum kann ich eine generische Catch-Anweisung in C# schreiben, die nichts tut?

Ich habe die Überprüfung und das Schreiben Circuit Breaker Code vor kurzem. Die folgende Methode wird kompiliert, aber der catch-Block wird nie eingegeben. Ich habe viele Workarounds, und dies ist nicht die einzige Möglichkeit, das richtige Verhalten (Filterung Ausnahmen) zu bekommen, aber ich bin neugierig warum dies kompiliert und nicht funktioniert!

public void AttemptCall<TException>(Action action) 
    where TException : Exception 
{ 
    try 
    { 
     action(); 
    } 
    catch(TException e) // This block is never entered! 
    { 
     state.ActUponException(e); 
     throw; 
    } 
} 

Hier ist ein Test, der den Sperranschlag des vorherigen Verfahrens eingeben sollte.

[TestMethod] 
public void Throw_an_exception() 
{ 
    circuitBreaker.AttemptCall<Exception>(() => throw new Exception()); 
    // test the circuit breaker's state 
} 
+0

ich nichts falsch mit dem Code sehen Sie auf dem Laufenden. vielleicht passiert etwas Seltsames innerhalb von state.ActUponException (e). – Jimmy

+0

+ 1. gute Frage. –

+0

Es sollte entweder nicht kompilieren und nicht zulassen, einen generischen Typ als den catch-Filter zu verwenden ODER kompilieren und die Laufzeitausnahmebedingung richtig abgefangen und behandelt haben. Die Tatsache, dass es kompiliert, aber dann die Ausnahme nicht erfasst, ist seltsam. –

Antwort