2012-11-26 19 views
17

Tôi đã nhìn vào một số mã thuộc một trong các ứng dụng của chúng tôi trông như sau:AggregateException - AggregateException.Flatten() là gì.

catch (AggregateException ae) 
{ 
    this._logger.Log(ae.Flatten().InnerException.ToString(), Category.Exception, Priority.High); 
} 

Câu hỏi của tôi là thế này. Tôi biết những gì AggregateException.Flatten() không, và tôi biết những gì AggregateException.Flatten().InnerExceptions đại diện. Tuy nhiên, những gì hiện AggregateException.Flatten().InnerException (duy nhất) đại diện cho?

Trả lời

35

Nó sẽ chỉ là một của Ngoại lệ không tổng hợp trong ngoại lệ ban đầu. Vì vậy, ví dụ, nếu bạn có một khởi đầu AggregateException của:

AggregateException 
    AggregateException 
     IOException("x") 
     IOException("y") 
    IOException("z") 

Sau đó InnerException của kết quả dẹt sẽ đi ra như một trong hai IOException("x"), IOException("y") hoặc IOException("z"). Tôi không tin rằng có bất kỳ đảm bảo nào về số sẽ là như vậy. (Tôi tin rằng hành vi hiện tại sẽ cung cấp cho phiên bản "z" tại thời điểm này ...) Đây sẽ là phiên bản đầu tiên của InnerExceptions trên phiên bản được làm phẳng, nhưng điều đó sẽ được xem là một liên kết của tất cả các ngoại lệ gốc không tổng hợp , không có lệnh bảo đảm.

Về cơ bản InnerException không hữu ích cho AggregateException. Sẽ hữu ích hơn nếu bạn đăng nhập tất cả số InnerExceptions ... hoặc chỉ gọi ToString() vào ngoại lệ cấp cao nhất, giữ nguyên tất cả cấu trúc ...