Al manejar excepciones en tareas TPL, me he encontrado con dos formas de manejar excepciones. La primera captura la excepción dentro de la tarea y lo devuelve en el resultado de este modo:Administración de excepciones de la biblioteca paralela de tareas
var task = Task<Exception>.Factory.StartNew(
() =>
{
try
{
// Do Something
return null;
}
catch (System.Exception e)
{
return e;
}
});
task.ContinueWith(
r =>
{
if (r.Result != null)
{
// Handle Exception
}
});
La segunda es la que se muestra en la documentación y supongo que la forma correcta de hacer las cosas:
var task = Task.Factory.StartNew(
() =>
{
// Do Something
});
task.ContinueWith(
r =>
{
if (r.Exception != null)
{
// Handle Aggregate Exception
r.Exception.Handle(y => true);
}
});
Me pregunto si hay algo malo con el primer acercamiento. He recibido excepciones de 'excepción agregada no controlada' de vez en cuando usando esta técnica y me preguntaba cómo podría suceder esto.
Para aclarar, creo que el segundo patrón es el mejor, pero tengo un fragmento de código que hace uso del primer patrón y estoy tratando de averiguar si es necesario volver a factorizar, es decir, si resulta que no todas las excepciones quedarán atrapadas.
Tuve el mismo problema, aunque lo comprobé con task.IsFaulted, encontré que si tenía una excepción durante la tarea, incluso si lo primero que hice fue verificar eso, y lo noté y desistí, todavía causó problemas ... y tengo una excepción que se escapa que no debería tener ... – BugFinder