2010-01-08 4 views
10

Powiel możliwe:
Why can’t I catch a generic exception in C#?Dlaczego można napisać ogólne oświadczenie połowowe w języku C#, który nic nie robi?

I zostały przeglądanie i pisanie Circuit Breaker kod niedawno. Poniższa metoda kompiluje, ale blok catch nigdy nie jest wprowadzany. Mam wiele obejść i nie jest to jedyny sposób, aby uzyskać właściwe zachowanie (wyjątki filtrowania), ale jestem ciekawy, , dlaczego to kompiluje i nie działa!

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

Oto test, który powinien wejść do bloku catch poprzedniej metodzie.

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

nie widzę niczego złego w kodzie zaksięgowane. być może coś dziwnego dzieje się wewnątrz stanu.ActUponException (e). – Jimmy

+0

+ 1. dobrze Pytanie. –

+0

Nie należy kompilować ani nie zezwalać na używanie typowego typu jako filtru przechwytywania LUB kompilować i zapewnić, aby wyjątek środowiska wykonawczego był poprawnie przechwytywany i obsługiwany. Fakt, że kompiluje, ale nie przechwytuje wyjątku, jest dziwny. –

Odpowiedz

Powiązane problemy