W aplikacji, nad którą pracuję, każdy błąd logiki biznesowej powoduje zgłoszenie wyjątku, a kod wywołujący obsługuje wyjątek. Ten wzór jest używany w całej aplikacji i działa dobrze.Zgłaszanie wielu wyjątków w .Net/C#
Mam sytuację, w której będę próbował wykonać szereg zadań biznesowych z poziomu warstwy biznesowej. Wymaganie to polega na tym, że awaria jednego zadania nie powinna spowodować zakończenia procesu. Inne zadania powinny nadal być możliwe do wykonania. Innymi słowy, nie jest to operacja atomowa. Problem polega na tym, że pod koniec operacji chcę powiadomić kod wywołujący, że wystąpił wyjątek lub wyjątki, zgłaszając wyjątek. Rozważmy następujący psuedo-fragment kodu:
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
}
Co mam rzucać? Napotkałem ten wzorzec już w mojej karierze. W przeszłości zachowałem listę wszystkich wyjątków, a następnie wyrzucono wyjątek zawierający wszystkie złapane wyjątki. To nie wydaje się być najbardziej eleganckim podejściem. Ważne jest zachowanie jak największej liczby szczegółów od każdego wyjątku do chwili obecnej do kodu wywołującego.
Myśli?
Edytuj: Rozwiązanie musi być napisane w .Net 3.5. Nie mogę korzystać z żadnych bibliotek beta, lub wyjątek AggregateException w .Net 4.0, o którym wspomniała Bradley Grainger (poniżej) byłby dobrym rozwiązaniem dla wyjątków kolekcji do rzucania.
Po prostu wyrzuć wyjątek. Po jego zalogowaniu (i zrobieniu czegokolwiek innego), wyrzuć go ponownie, aby wypluł stos. – Kon
Który wyjątek? Mój scenariusz zakłada wiele wyjątków. –
Właśnie zaktualizowałem swoją odpowiedź, aby zauważyć, że można klonować wyjątek AggregateException na .NET 3.5 w sposób, który ułatwia aktualizację do prawdziwego typu .NET 4.0, kiedy zostanie wydany. Nadal musisz napisać kod (aby sklonować klasę), ale jest kompatybilny z przyszłymi. –