2011-10-28 6 views
6

que tienen una clase genérica que atrapa excepciones de T:¿Es posible detectar una excepción que no puede manejar (en C#)?

 
    public abstract class ErrorHandlingOperationInterceptor<T> : OperationInterceptor where T : ApiException 
    { 
     private readonly Func<OperationResult> _resultFactory; 

     protected ErrorHandlingOperationInterceptor(Func<OperationResult> resultFactory) 
     { 
      _resultFactory = resultFactory; 
     } 

     public override Func<IEnumerable<OutputMember>> RewriteOperation(Func<IEnumerable<OutputMember>> operationBuilder) 
     { 
      return() => 
      { 
       try 
       { 
        return operationBuilder(); 
       } 
       catch (T ex) 
       { 
        var operationResult = _resultFactory(); 
        operationResult.ResponseResource = new ApiErrorResource { Exception = ex }; 
        return operationResult.AsOutput(); 
       } 
      }; 
     } 
    } 

Con subclases de excepciones específicas por ejemplo,

 
    public class BadRequestOperationInterceptor : ErrorHandlingOperationInterceptor<BadRequestException> 
    { 
     public BadRequestOperationInterceptor() : base(() => new OperationResult.BadRequest()) { } 
    } 

Todo parece funcionar perfectamente. Pero, de alguna manera, en los registros (una vez, no cada vez) es un InvalidCastException:

 
System.InvalidCastException: Unable to cast object of type 'ErrorHandling.Exceptions.ApiException' to type 'ErrorHandling.Exceptions.UnexpectedInternalServerErrorException'. 
    at OperationModel.Interceptors.ErrorHandlingOperationInterceptor`1.c__DisplayClass2.b__1() in c:\BuildAgent\work\da77ba20595a9d4\src\OperationModel\Interceptors\ErrorHandlingOperationInterceptor.cs:line 28 

Línea 28 es la captura.

¿Qué me estoy perdiendo? ¿He hecho algo realmente tonto?

+7

Bueno, siempre hay 'TruthException', porque usted no puede manejarlo –

+0

Qué línea en el código es la línea 28? –

+0

@KierenJohnstone, ¡robaste mi comentario! –

Respuesta

3

Como dijo smithy, su T es del tipo ApiErrorResource. Está, en algún lugar de su código, intentando crear su ErrorHandlingOperationInterceptor con un Exception que NO se deriva de ApiErrorResource.

try 
{ 
// throw Exception of some sort 
} 
catch (BadRequestException ex) 
{ 
    BadRequestOperationInterceptor broi = new BadRequestOperationInterceptor(); 
} 
catch (Exception ex) 
{ 
    // this is NOT right 
    BadRequestOperationInterceptor broi = new BadRequestOperationInterceptor(); 
} 
+1

En realidad, creo que es tipo 'ApiException'. – TrueWill

+0

No entiendo cómo responde esto a la pregunta. El sistema de tipos no debe permitir el problema que creo que intenta demostrar: tenga en cuenta la restricción genérica 'donde T: ApiException'. El código del OP no está haciendo ningún lanzamiento, ¿cómo puede una 'InvalidCastException' dar como resultado? –

+0

Supongo que debería haber dicho "algún otro ELSE en tu código". –

Cuestiones relacionadas