Il est toujours préférable de coder sans possibilité de lancer des exceptions en premier lieu. Si vous avez besoin d'une raison: Ils sont lents. Quantifiablement plus lent que de coder autour d'eux de la manière la plus inélégante dans la plupart des cas. Cela étant dit, parfois, ils sont inévitables à cause du code que d'autres personnes ont écrit ou parce que vous voulez vraiment que le programme explose à la place de l'utilisateur (voir échec catastrophique). Ce n'est que dans ces deux cas que l'exception gère le chemin à parcourir.
Mais cela ne signifie pas que vous enveloppez tous IEnumerable<T>.First()
dans un if(sequence.Count() > 0)
. Apprenez à bien structurer votre code, de sorte que vous n'appelez jamais le .First()
sur une séquence vide en premier lieu. Le code élégant est la victoire.
j'ai écrit récemment une application rapide pour mon employeur à utiliser dans un système automatisé (où l'utilisateur ne siège pas au clavier) que doit demander à l'utilisateur d'entrer les informations de connexion dans args de ligne de commande (pensez fichier batch) ou un fichier de configuration sinon il explose intentionnellement dans leur visage, selon les spécifications. Dans ce cas, une exception est justifiée.
Tout le code ci-dessous démontre ma philosophie sur les exceptions. Un exemple de codage sans exception dans cette méthode d'extension que je viens d'écrire.
public static bool All<T>(this IEnumerable<T> list, Func<T, T, bool> func)
{
if (list.Count() < 2)
return true;
T first = list.First();
return list.Skip(1).Aggregate(true, (i, k) => i && func(first,k));
}
avis ci-dessous, je traite des exceptions E/S dans le cadre de la méthode E/S, mais j'analysé les données contenues dans le fichier de configuration de telle sorte que ma logique ne sera jamais jeter une exception. Notez comment le .Count() est vérifié à 2 dans toutes les données. À ce stade, je peux être sûr que .First() et .Last() seront non seulement valables pour le compilier et ne pas jeter des exceptions, mais seront garanties pour donner des morceaux de données potentiellement valides (espaces non-blancs, valeurs différentes). C'est le genre de philosophie que je vous recommande d'adapter quand vous pensez à la gestion des exceptions ->Comment filtrer et contrôler mes données d'une manière référentielle transparente pour éliminer complètement les erreurs dans le cadre de la méthode?
public static class ConfigParser
{
public static Dictionary<string, string> PullFromConfigFile()
{
ParallelQuery<Tuple<string, string>> data;
try
{
TextReader tr = new StreamReader("config.cfg");
data = tr.ReadToEnd()
.Split('\n')
.AsParallel()
.Select(i => new string(i.TakeWhile(k => k != '#').ToArray()))
.Where(i => !i.IsNullOrWhiteSpace())
.Select(i => i.Split('\t')
.Where(k => !k.IsNullOrWhiteSpace())
.Select(k => k.Trim())
)
.Where(i => i.Count() == 2)
.Select(i => new Tuple<string, string>(i.First(), i.Last()));
tr.Close();
}
catch (IOException)
{
Logger.Bad("config.cfg file was not found");
return new Dictionary<string, string>();
}
return ConfigParser.ParseIntoDict(data);
}
private static Dictionary<string, string> ParseIntoDict(ParallelQuery<Tuple<string, string>> data)
{
var agg = new Dictionary<string, string>();
foreach (var entry in data)
{
if (!agg.ContainsKey(entry.Item1))
agg.Add(entry.Item1, entry.Item2);
}
var width = agg.Keys.Max(k => k.Length);
agg.ForAll(i => Logger.Log("Loaded Data: {0} {1}",
i.Key.SetWidth(width, '-'), i.Value));
return agg;
}
}
extensions utilisées:
public static class Extensions
{
public static string SetWidth(this string item, int width, char padder, bool right = true)
{
if (item == null)
return new string(padder, width);
if (width > item.Length)
return right ? item.PadRight(width, padder) : item.PadLeft(width, padder);
return item.Substring(0, width);
}
public static bool IsNullOrWhiteSpace(this string str)
{
return string.IsNullOrWhiteSpace(str);
}
}
+1, à condition que vous attraper que si vous pouvez le manipuler :) – user7116
Oded, Pouvez-vous ouvrir peut-être cela un peu plus; Ce que je voulais souligner ici, c'est abuser de l'exception d'une manière qui est facultative pour renvoyer d'autres informations à la place. Comme une alternative au type de retour réel de la méthode. Avez-vous eu mon sens? – pencilCake
Ok! Maintenant, j'ai compris. Votre modification de votre réponse est plus claire pour moi maintenant. ;) Merci! – pencilCake