2010-03-16 270 views
11

在C#中,下面的代碼會拋出包含調用堆棧中附加信息的e異常拋出

... 
catch(Exception e) 
{ 
    e.Data.Add("Additional information","blah blah"); 
    throw; 
} 

回答

12

是的,它會的。很多開發人員並沒有意識到下面的代碼會在調用棧中拋出新的異常,而不是在catch之前先前調用堆棧的調用。

... 
catch(Exception e) 
{ 
    e.Data.Add("Additional information","blah blah"); 
    throw e; 
} 

我學會了這個艱難的道路!

+0

+1爲反例:) – Pharabus 2010-03-16 12:19:22

+1

這裏是來自Eric Lippert的文章:http://blogs.msdn.com/ericlippert/archive /2010/03/04/too-much-reuse.aspx 「The throw;」不重置堆棧軌跡,「throw ex;」是否「 – ram 2010-03-16 12:25:20

1

異常並不是不可變的,並且能夠向它們添加信息是其中一個原因。

所以,是的,數據將被添加到異常信息冒泡。

4
 var answer = "No"; 
     try 
     { 
      try 
      { 
       throw new Exception(); 
      } 
      catch (Exception e) 
      { 
       e.Data.Add("mykey", "myvalue"); 
       throw; 
      } 
     } 
     catch (Exception e) 
     { 
      if((string)e.Data["mykey"] == "myvalue") 
       answer = "Yes"; 
     } 

     Console.WriteLine(answer); 
     Console.ReadLine();  

當您運行的代碼,你會發現,答案是肯定的:-)

+1

......非常有趣;) – Ben 2010-03-16 12:14:34

1

你可以做到這一點,但由於FxCop的我總是創建自定義異常當過我拋出和異常。這使調用者能夠輕鬆捕捉並理解不同類型的錯誤。如果您需要包含後續異常,則可以使用異常的InnerException或簡單地爲新的異常添加成員變量。

這告訴你如何讓你自己成功。 http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/

這是人們喜歡跳過的編程事物之一,因爲它只是額外的工作以獲得應用程序的功能。

這是我個人編程之禪的一頁:

你的計劃是你的房子。儘可能地做到這一點,所以它很容易和有趣的生活。

+0

+1對於創建/捕獲自定義例外。它顯然取決於你是否能夠控制拋出異常的代碼,如果它是第三方庫,你會被它拋出的異常阻塞;-) – 2010-03-16 12:33:51