Trong một ứng dụng tôi làm việc trên, bất kỳ lỗi logic nghiệp vụ nào cũng gây ra ngoại lệ và mã gọi xử lý ngoại lệ. Mẫu này được sử dụng trong suốt ứng dụng và hoạt động tốt.Ném nhiều ngoại lệ trong .Net/C#
Tôi có một tình huống mà tôi sẽ cố gắng thực hiện một số tác vụ kinh doanh từ bên trong lớp doanh nghiệp. Yêu cầu cho điều này là một thất bại của một nhiệm vụ không nên gây ra quá trình chấm dứt. Các nhiệm vụ khác vẫn có thể thực thi. Nói cách khác, đây không phải là một hoạt động nguyên tử. Vấn đề tôi có là ở phần cuối của hoạt động, tôi muốn thông báo cho mã gọi rằng một ngoại lệ hoặc ngoại lệ đã xảy ra bằng cách ném một ngoại lệ. Hãy xem đoạn mã psuedo-code sau:
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
}
Tôi phải làm gì? Tôi đã gặp phải mô hình này trước đây trong sự nghiệp của tôi. Trong quá khứ tôi đã giữ một danh sách tất cả các ngoại lệ, sau đó ném một ngoại lệ có chứa tất cả các ngoại lệ bị bắt. Điều này dường như không phải là cách tiếp cận trang nhã nhất. Điều quan trọng là phải bảo toàn càng nhiều chi tiết càng tốt từ mỗi ngoại lệ để trình bày đến mã gọi.
Suy nghĩ?
Chỉnh sửa: Phải viết giải pháp .Net 3.5. Tôi không thể sử dụng bất kỳ thư viện beta nào, hoặc AggregateException trong .Net 4.0 như được đề cập bởi Bradley Grainger (bên dưới) sẽ là một giải pháp tốt đẹp cho các ngoại lệ thu thập để ném.
Chỉ cần trả lại ngoại lệ. Sau khi bạn đăng nhập nó (và làm bất cứ điều gì khác), rethrow nó để nó bong bóng lên ngăn xếp. – Kon
Ngoại lệ nào? Kịch bản của tôi giả định nhiều ngoại lệ. –
Tôi vừa cập nhật câu trả lời của mình để lưu ý rằng bạn có thể sao chép AggregateException trên .NET 3.5 theo cách giúp dễ dàng nâng cấp lên loại .NET 4.0 thực khi nó được phát hành. Bạn vẫn phải viết mã (để nhân bản lớp), nhưng nó tương thích về phía trước. –