Nó sẽ gây ra lỗi. Bạn cũng đang trên đường thực hiện lại foreach
. Làm thế nào về chỉ:
foreach (var item in list)
{
try
{
// dangerous thing with item
}
catch (Exception e)
{
// how do you want to log this?
}
}
Điều này có lợi ích khi làm việc trong hầu hết các phiên bản .NET và rõ ràng là có hiệu quả phụ. Tất nhiên, bạn có thể đặt mã này trực tiếp trong đại biểu ForEach
, nhưng tôi sẽ chỉ đề nghị rằng nếu nó sẽ là một phương thức (chứ không phải là hàm lambda).
Một lựa chọn hợp lý là tạo ra ForEachWithCatch
phần mở rộng của riêng bạn mà bắt tất cả các trường hợp ngoại lệ và gửi chúng trở lại cho người gọi:
public static IEnumerable<Tuple<T,Exception>> ForEachWithCatch<T>(this IEnumerable<T> items, Action<T> action)
{
var exceptions = new List<Tuple<T,Exception>>();
foreach(var item in items)
{
try
{
action(item);
}
catch(Exception e)
{
exceptions.Add(Tuple.Create(item, e));
}
}
return exceptions;
}
này gửi lại một đếm được của mỗi mục mà thất bại và nó tương ứng ngoại lệ.
tôi đã cập nhật tiêu đề câu hỏi của mình, cảm ơn jon – Jason
@ Jason: Righto - sẽ loại bỏ câu đầu tiên đó. Đã chỉnh sửa câu trả lời của tôi ... –
cảm ơn bạn vì câu trả lời rất tốt, suy nghĩ rất thông tin này. – Jason