В приложении, над которым я работаю, любая ошибка бизнес-логики вызывает исключение, и вызывающий код обрабатывает исключение. Этот шаблон используется во всем приложении и работает хорошо.
У меня есть ситуация, когда я буду пытаться выполнить ряд бизнес-задач изнутри бизнес-уровня. Требование для этого состоит в том, что отказ одной задачи не должен приводить к завершению процесса. Другие задачи все равно должны быть выполнены. Другими словами, это не атомная операция. Проблема заключается в том, что в конце операции я хочу уведомить вызывающий код о том, что исключение или исключения произошли путем исключения исключения. Рассмотрим следующий фрагмент кода psuedo:
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
}
Что я бросаю? Я уже встречался с этой моделью в своей карьере. В прошлом я сохранил список всех исключений, а затем выбрал исключение, содержащее все обнаруженные исключения. Это не похоже на самый изящный подход. Его важно сохранить как можно больше деталей от каждого исключения до настоящего кода.
Мысли?
Изменить: решение должно быть записано в .Net 3.5. Я не могу использовать какие-либо бета-библиотеки, или исключение AggregateException в .Net 4.0, как упоминалось Bradley Grainger (ниже), было бы хорошим решением для исключений коллекции для броска.