2012-06-02 15 views
10

Si consideri il seguente programma "Safe":Perché l'eccezione .net non viene rilevata?

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(); 
    } 
} 

non dovrebbe mai completa con un'eccezione. Ma perché fallisce quando lo eseguo? Perché SafeMethodWillNeverThrow() lancia l'eccezione?

Prima di testare questo codice, leggere la risposta di seguito.

+0

Eseguo il codice di cui sopra e non è stato in grado di riprodurre il problema: funziona come previsto, viene rilevata un'eccezione – sergtk

+0

Verificare di aver abilitato il Contratto di runtime Contratti di codice per il progetto e di creare la configurazione di rilascio. Non riesco ancora a riprodurlo per favore fammi sapere la versione dei contratti di codice che stai utilizzando. Grazie –

+0

riproducibile con 1.4.50327.0. Strano: -O – sergtk

risposta

25

È perché si dispone del Contratto di runtime di Contratti di codice abilitato nelle proprietà del progetto che si utilizza la configurazione di rilascio. E se siete, il vostro SafeMethodWillNeverThrow() il metodo viene convertito in quanto segue con l'aiuto di codice dei contratti masterizzatore:

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

Ouch!

Conclusione: non fidarti di quello che vedi - leggi IL :).

Il problema è riproducibile con seguente codice dei contratti versioni:

  1. 1.4.50327.0
  2. 1.4.50126.1

    Sto usando Code Contracts e vorrei avere l'errore risolto al più presto. L'ho pubblicato su Code Contracts forum. L'unico modo per ripararlo presto è di attirare l'attenzione su di esso. Quindi, per favore votare, specialmente sul forum Codice Contratti

Aggiornamento Maggio 2016:

Versione 1.9.10714.2 dà una diversa un'eccezione Eccezione non gestita: System.InvalidProgramException: Common Language Runtime rilevamento di un programma valido.

+0

'Bella' riscrivi! *brivido* –

Problemi correlati