2013-08-20 80 views
2

以下是我在C#代碼之後例外:投擲修改其解釋

catch(Exception ex) 
{ 
    ex.Data.Add("VarName", "object"); 
    throw; 
} 

問:上面做的,我是不是要失去我加入到數據字典中的項目嗎? - >在我看來,我重新拋出catch語句中捕獲的異常,並且它沒有從下一行添加的Dictionary記錄。

如果上述代碼改爲:

catch(Exception ex) 
{ 
    ex.Data.Add("VarName", "object"); 
    throw ex; 
} 
  • 但在這種情況下,我並不想重置堆棧跟蹤。

通過網絡搜索這個和所以,但沒有運氣。

TIA!

+1

如果你想添加一些數據到異常,然後用數據包裝異常在更具體的異常,並拋出該特定的異常 –

+0

你試過了;編寫一些測試代碼示例應該不會超過幾分鐘? –

+0

剛剛嘗試 - 巴特的答案是正確的。我最初的代碼工作得很好。 – coder0h1t

回答

3

你的初始代碼應該工作得很好。你不應該丟失字典條目。

[編輯]:詳細說明。

讓我們以下面的例子代碼:

using System; 
class Program 
{ 
    static void Main() 
    { 
     Change(); 
     Replace(); 
     Inner(); 
    } 

    static void Change() 
    { 
     try { 
      try { 
       throw new Exception("This is a message"); 
      } catch (Exception e) { 
       e.Data.Add("foo", "bar"); 
       throw; 
      } 
     } catch (Exception e) { 
      System.Diagnostics.Trace.WriteLine(e.Message); 
      System.Diagnostics.Trace.WriteLine(e.Data["foo"]); 
     } 
    } 

    static void Replace() 
    { 
     try { 
      try { 
       throw new Exception("This is a message"); 
      } catch (Exception e) { 
       e = new Exception("Different message", e); 
       e.Data.Add("foo", "bar"); 
       throw; 
      } 
     } catch (Exception e) { 
      System.Diagnostics.Trace.WriteLine(e.Message); 
      System.Diagnostics.Trace.WriteLine(e.Data["foo"]); 
     } 
    } 

    static void Inner() 
    { 
     try { 
      try { 
       throw new Exception("This is a message"); 
      } catch (Exception e) { 
       e.Data.Add("foo1", "bar1"); 
       e = new Exception("Different message", e); 
       e.Data.Add("foo2", "bar2"); 
       throw e; 
      } 
     } catch (Exception e) { 
      System.Diagnostics.Trace.WriteLine(e.Message); 
      System.Diagnostics.Trace.WriteLine(e.Data["foo2"]); 
      System.Diagnostics.Trace.WriteLine(e.InnerException.Message); 
      System.Diagnostics.Trace.WriteLine(e.InnerException.Data["foo1"]); 
     } 
    } 
} 

當拋出一個Exception,什麼是真正的拋出是一個異常對象的引用。這個引用是被捕獲和重新生成的。修改底層對象是好的。這是你最初的代碼所做的,以及我的例子中的Change方法。

Replace方法中,我們不修改對象,而是修改引用本身。我們使用不同的消息指向一個全新的Exception對象,並且將它關閉,我們也添加一些數據。但是,所有這些東西都會丟失,因爲沒有參數的throw會重新引發原始引用。

如果需要使用第二種情況,可以通過將原始異常作爲InnerException來跟蹤堆棧跟蹤,就像我在Inner方法中所做的那樣。

+0

我在工作中匆忙回答了這個問題。添加了一個解釋。 –