Se arrojará un error. También está en camino de volver a implementar foreach
. ¿Qué tal solo:
foreach (var item in list)
{
try
{
// dangerous thing with item
}
catch (Exception e)
{
// how do you want to log this?
}
}
Esto tiene el beneficio de funcionar en la mayoría de las versiones de .NET y obviamente tiene efectos secundarios. Por supuesto, puede poner este código directamente en el delegado ForEach
, pero solo sugeriría que sea un método en sí mismo (en lugar de una función lambda).
Una alternativa razonable es crear su propia ForEachWithCatch
extensión que captura todas las excepciones y los envía de vuelta a la persona que llama:
public static IEnumerable<Tuple<T,Exception>> ForEachWithCatch<T>(this IEnumerable<T> items, Action<T> action)
{
var exceptions = new List<Tuple<T,Exception>>();
foreach(var item in items)
{
try
{
action(item);
}
catch(Exception e)
{
exceptions.Add(Tuple.Create(item, e));
}
}
return exceptions;
}
Esto envía de vuelta un enumerable de cada elemento que falló y su correspondiente excepción.
he actualizado el título de mi pregunta, gracias jon – Jason
@Jason: Righto - se deshace de la primera frase. He editado mi respuesta ... –
gracias por esta respuesta bien pensada y muy informativa. – Jason