2012-06-13 50 views
4

考慮下面的代碼片段:總結例外不保存單個異常消息

foreach (var setting in RequiredSettings) 
       { 
        try 
        { 
         if (!BankSettings.Contains(setting)) 
         { 
          throw new Exception("Setting " + setting + " is required."); 
         } 
        } 
        catch (Exception e) 
        { 
         catExceptions.Add(e); 
        } 
       } 
      } 
      if (catExceptions.Any()) 
      { 
       throw new AggregateException(catExceptions); 
      } 
     } 
     catch (Exception e) 
     { 
      BankSettingExceptions.Add(e); 
     } 

     if (BankSettingExceptions.Any()) 
     { 
      throw new AggregateException(BankSettingExceptions); 
     } 

catExceptions是我添加到例外列表。當循環完成後,我將這個列表添加到AggregateException然後拋出它。當我運行調試器時,catExceptions集合中會出現每個字符串消息「需要設置X」。但是,當涉及到AggregateException時,現在唯一的消息是「發生了一個或多個錯誤」。

有沒有一種方法可以在保持單個消息的同時進行聚合?

謝謝!

回答

5

有沒有一種方法可以在保持單個消息的同時進行聚合?

是的。 InnerExceptions屬性將包含所有的例外信息。

您可以根據需要顯示這些信息。例如:

try 
{ 
    SomethingBad(); 
} 
catch(AggregateException ae) 
{ 
    foreach(var e in ae.InnerExceptions) 
     Console.WriteLine(e.Message); 
} 
+0

+1有許多方法可以將消息放在一起。或許,如果你在對話中報道這一點,LINQ可能會更有意義。 – JDB

+0

@ Cyborgx37當然 - 我只是這樣做,以顯示它們在哪裏......不以任何方式暗示它是最好的選擇;) –

2

的海報上面已經給了正確的答案。然而,而不是使用foreach循環可以使用.handle()方法。

try 
{ 
    SomethingBad(); 
} 
catch(AggregateException ae) 
{ 
    ae.handle(x => { 
     Console.WriteLine(x.Message); 
     return true; 
    }); 
}