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);
}
}
}
Funciona para mí, imprimiendo 'atrapame 0 atrapame 1 Inicializado' – SLaks
funciona en mi máquina. Ejecutarlo sin depuración (CTRL-F5) – jeroenh
He intentado ejecutarlo con Ctrl-F5 y su derecha funciona, pero ¿alguien ahora por qué no funciona durante la depuración? – Rehan