2012-06-02 17 views
10

Considere el siguiente programa de "seguro":¿Por qué la excepción .net no está atrapada?

internal class Safe 
{ 
    public static void SafeMethodWillNeverThrow() 
    { 
     try 
     { 
      var something = ThrowsNewException(); 
      Func<int, string> x = p => something.ToString(); 
     } 
     catch (Exception) 
     { 
     } 
    } 

    private static object ThrowsNewException() 
    { 
     throw new Exception(); 
    } 

    public static void Main() 
    { 
     SafeMethodWillNeverThrow(); 
    } 
} 

nunca debería completa con una excepción. ¿Pero por qué falla cuando lo ejecuto? ¿Por qué SafeMethodWillNeverThrow() arroja la excepción?

Antes de probar este código, lea la respuesta a continuación.

+0

Ejecuto el código anterior y no pude reproducir el problema: funciona como se esperaba, se detecta una excepción – sergtk

+0

Compruebe que tiene habilitada la comprobación de contratos de tiempo de ejecución de contratos de código para su proyecto y crea la configuración de la versión. Todavía no puedo reproducirlo, por favor, hágame saber la versión de los contratos de código que está utilizando. Gracias –

+0

reproducible con 1.4.50327.0. Raro: -O – sergtk

Respuesta

25

Es porque tiene habilitada la verificación de contrato de tiempo de ejecución de contratos de código en las propiedades de su proyecto. Y si es así, su SafeMethodWillNeverThrow() método se convierte en la siguiente con la ayuda del Código de Contratos de re-escritura:

public static void SafeMethodWillNeverThrow() 
{ 
    object something = ThrowsNewException(); 
    try 
    { 
     Func<int, string> func1 = p => something.ToString(); 
    } 
    catch (Exception) 
    { 
    } 
} 

Ay!

Conclusión: No confíe en lo que ve - lea IL :).

El problema es reproducible con las siguientes versiones de Contratos Código:

  1. 1.4.50327.0
  2. 1.4.50126.1

    estoy usando Code Contracts y me gustaría tener fijado el error lo antes posible. Lo he publicado en Code Contracts forum. La única forma de repararlo pronto es atraer la atención suficiente sobre él. Así que por favor voten, especialmente en el foro de contratos Código

Actualización mayo 2016:

versión 1.9.10714.2 da una excepción Excepción no controlada diferente: System.InvalidProgramException: Common Language Runtime detecta un programa válido.

+0

¡'Buena' reescritura! *estremecimiento* –

Cuestiones relacionadas