8
votes

Si une exception est lancée dans une liste .foreseach, l'itération s'arrête-t-elle?

Si j'ai le code suivant: xxx

et disons SOMEMETHOD () jette une exception. Est-ce que foreach continue itération ou cela est-il juste arrêter là-bas là-bas?

Si cela se termine, existe-t-il un moyen d'obtenir le reste des éléments de la collection pour exécuter leurs méthodes ?


0 commentaires

3 Réponses :


13
votes

Oui, si une exception est lancée, la boucle se ferme. Si vous ne voulez pas ce comportement, vous devez manipuler des exceptions dans votre délégué. Vous pourrait strong> créer facilement une méthode d'emballage pour cela:

public static Action<T> SuppressExceptions<T>(Action<T> action)
{
    return item =>
    {
        try
        {
            action(item);
        }
        catch (Exception e)
        {
            // Log it, presumably
        }
    };
}


1 commentaires

Merci pour cette réponse bien pensée, très informative.



3
votes

Il lancera une erreur. Vous êtes également bien sur votre façon de réimplémenter foreach code>. Que diriez-vous de:

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


0 commentaires

0
votes

Si votre SOMEMETHOD CODE> a mis en œuvre un bloc d'essais, alors foreach continuera

list.ForEach(i => 
     {
         try
         {
             i.SomeMethod();
         }
         catch(Exception ex)
         {
         }
     });


0 commentaires