Dans une application, je travail sur toute la logique métier erreur provoque la levée d'une exception, et le code appelant gère l'exception. Ce modèle est utilisé tout au long de l'application et fonctionne bien.
J'ai une situation où je vais tenter d'exécuter un certain nombre de tâches à partir de l'intérieur de la couche de gestion. La condition pour cela est que l'échec d'une tâche ne doit pas causer la fin du processus. D'autres tâches devraient toujours être en mesure d'exécuter. En d'autres termes, ce n'est pas une opération atomique. Le problème que j'ai c'est qu'à la fin de l'opération, je tiens à avertir le code appelant qu'une ou des exceptions ne se produire par la levée d'une exception. Considérez les points suivants pseudo-extrait de code:
function DoTasks(MyTask[] taskList)
{
foreach(MyTask task in taskList)
{
try
{
DoTask(task);
}
catch(Exception ex)
{
log.add(ex);
}
}
//I want to throw something here if any exception occurred
}
Que dois-je les jeter? J'ai rencontré cette situation avant dans ma carrière. Dans le passé, j'ai gardé une liste de toutes les exceptions, puis jeté une exception qui contient tous les pêchés des exceptions. Cela ne semble pas être la plus élégante de l'approche. Il est important de préserver autant de détails que possible à partir de chaque exception de présenter le code appelant.
Pensées?
Edit: La solution doit être écrite .Net 3.5. Je ne peut pas utiliser de bêta bibliothèques, ou de l'AggregateException dans .Net 4.0, comme mentionné par Bradley Grainger (ci-dessous) serait une belle solution pour la collecte des exceptions à jeter.