2011-05-05 7 views
8

Estoy tratando de inicializar un objeto costoso, a través de la clase Lazy de .NET, que puede fallar debido a una excepción. La instancia de la clase perezosa se almacena en caché porque es posible que en un intento subsiguiente la inicialización pueda tener éxito. Estoy creando así el ejemplo de la siguiente manera:No se puede detectar la excepción lanzada durante la inicialización lenta (C# .NET)

Lazy<someObject> lazyValue = 
    new Lazy<someObject>(() => { expensive initialization; }, 
     System.Threading.LazyThreadSafetyMode.PublicationOnly); 

De acuerdo con la documentación de .NET con PublicationOnly la excepción no será almacenado en caché y por lo tanto se puede intentar reiniciar el valor. Me encontré con el problema de que la excepción no puede ser atrapada. Ahora, es bastante simple escribir mi propia clase perezosa, pero me gustaría saber si estoy usando la clase Lazy de .NET incorrectamente o si es un error.

El (simplificado) siguiente código reproducir el problema:

private static void DoesntWork() 
{ 
    int i = 0; 

    Lazy<string> lazyValue = new Lazy<string>(() => 
    { 
     if (i < 2) 
     { 
      throw new Exception("catch me " + i); 
     } 

     return "Initialized"; 
    }, System.Threading.LazyThreadSafetyMode.PublicationOnly); 

    for (; i < 3; i++) 
    { 
     try 
     { 
      Console.WriteLine(lazyValue.Value); 
     } 
     catch (Exception exc) // I do not catch the exception! 
     { 
      Console.WriteLine(exc.Message); 
     } 
    } 
} 
+2

Funciona para mí, imprimiendo 'atrapame 0 atrapame 1 Inicializado' – SLaks

+0

funciona en mi máquina. Ejecutarlo sin depuración (CTRL-F5) – jeroenh

+1

He intentado ejecutarlo con Ctrl-F5 y su derecha funciona, pero ¿alguien ahora por qué no funciona durante la depuración? – Rehan

Respuesta

5

Bueno, parece que debería funcionar. Si está diciendo que está lanzando la excepción pero no la detecta, entonces ... por casualidad, ¿se está ejecutando en Visual Studio y ha seleccionado ArgumentException en el menú Depurar> Excepciones para indicar que siempre se divide allí?

+0

El tipo de excepción no importa, también ocurre con System.Exception y sí, digo que está lanzado y no atrapado ... – Rehan

+0

@Rehan Bueno, en los comentarios anteriores, dice que funciona sin depuración. Esto sugiere que puedo estar en lo cierto. ¿Has marcado el menú Depurar> Excepciones? – Tesserex

+2

Tiene razón, Visual Studio se estableció para que siempre se rompa pero me confundí porque cuando se rompe, aparece el cuadro de excepción con el título: "La excepción no fue controlada por el código de usuario", lo que claramente era. – Rehan

Cuestiones relacionadas