2011-09-07 133 views
1

我是C#的新手,從來沒有嘗試創建一個try catch塊,我得到一個錯誤,其中一個HybridDictionary中的錯誤指示「A keys already exists」,如何將.Adds放入一個try catch塊,而忽略它,如果鍵已經存在:Try Catch Block

這裏是原代碼與2個HybridDictionaries:

public MWRichTextBox() : base() { 

     // Initialize default text and background colors 
     textColor = RtfColor.Black; 
     highlightColor = RtfColor.White; 

     // Initialize the dictionary mapping color codes to definitions 
     rtfColor = new HybridDictionary(); 
     rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua); 
     rtfColor.Add(RtfColor.Black, RtfColorDef.Black); 
     rtfColor.Add(RtfColor.Blue, RtfColorDef.Blue); 
     rtfColor.Add(RtfColor.Fuchsia, RtfColorDef.Fuchsia); 
     rtfColor.Add(RtfColor.Gray, RtfColorDef.Gray); 
     rtfColor.Add(RtfColor.Green, RtfColorDef.Green); 
     rtfColor.Add(RtfColor.Lime, RtfColorDef.Lime); 
     rtfColor.Add(RtfColor.Maroon, RtfColorDef.Maroon); 
     rtfColor.Add(RtfColor.Navy, RtfColorDef.Navy); 
     rtfColor.Add(RtfColor.Olive, RtfColorDef.Olive); 
     rtfColor.Add(RtfColor.Purple, RtfColorDef.Purple); 
     rtfColor.Add(RtfColor.Red, RtfColorDef.Red); 
     rtfColor.Add(RtfColor.Silver, RtfColorDef.Silver); 
     rtfColor.Add(RtfColor.Teal, RtfColorDef.Teal); 
     rtfColor.Add(RtfColor.White, RtfColorDef.White); 
     rtfColor.Add(RtfColor.Yellow, RtfColorDef.Yellow); 
     rtfColor.Add(RtfColor.WhiteSmoke, RtfColorDef.WhiteSmoke); 

     // Initialize the dictionary mapping default Framework font families to 
     // RTF font families 
     rtfFontFamily = new HybridDictionary(); 
     rtfFontFamily.Add(FontFamily.GenericMonospace.Name, RtfFontFamilyDef.Modern); 
     rtfFontFamily.Add(FontFamily.GenericSansSerif, RtfFontFamilyDef.Swiss); 
     rtfFontFamily.Add(FontFamily.GenericSerif, RtfFontFamilyDef.Roman); 
     rtfFontFamily.Add(FF_UNKNOWN, RtfFontFamilyDef.Unknown); 

     // Get the horizontal and vertical resolutions at which the object is 
     // being displayed 
     using(Graphics _graphics = this.CreateGraphics()) { 
      xDpi = _graphics.DpiX; 
      yDpi = _graphics.DpiY; 
     } 
    } 
+0

它是必不可少的,它在嘗試catch塊?我儘量避免他們在必要時,這裏是必要的。在我看來,最好在添加它之前檢查一個條目是否存在於集合中。 – hdougie

+0

每次忽略異常時,一隻小貓都會死亡。不要使用'try' /'catch'來壓制錯誤。用它來處理_和_report_錯誤。 – David

回答

16

作爲替代到包羅萬象的 qaundary,我建議通過Contains方法檢查項目是否存在。例如:

if (!rtfColor.Contains(RtfColor.White)) 
{ 
    rtfColor.Add(RtfColor.White, RtfColorDef.White); 
} 

讓我們這一點了進一步例證吉姆·B的建議(因爲這確實介紹每添加額外的線,並可能很快變得勢不可擋),我們可以創建一個簡單的方法,以「安​​全地添加項目」,即,添加項目僅如果還不與特定鍵存在的項集合(您可以在方法命名和訪問等方面的應用更多的特異性,但爲例):

private void AddItemToDictionary(HybridDictionary dictionary, object key, object value) 
{ 
    if (!dictionary.Contains(key)) 
    { 
     dictionary.Add(key, value); 
    } 
} 

AddItemToDictionary(rtfColor, RtfColor.Black, RtfColorDef.Black); 
AddItemToDictionary(rtfColor, RtfColor.White, RtfColorDef.White); 
AddItemToDictionary(rtfColor, RtfColor.Red, RtfColorDef.Red); 

如果需要,這可以擴展而非簡單地進行更新。

何時使用try/catch是另一回事,何時使用try/catch來忽略錯誤是另一種生活。

+6

肯定喜歡這種做法。創建一個名爲AddToDictionary()的方法,該方法檢查密鑰是否存在。如果沒有;添加它。如果是的話;或者跳過或更新。 –

+0

謝謝你的幫助@Mr。失望,我應該在創建HybridDictionary之後立即創建這個方法? – user932742

+0

@ user932742您可以將方法放在控件本身的類中 - 您不必在方法體內使用「HybridDictionary」在其外部定義該方法,而是通過名稱來調用它(並提供參數用於參數)。 –

0

你不得不圍繞各添加這樣的:

try 
{ 
    rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua); 
} 
catch (Exception e) // use right type of exception here 
{ 
    // log exception 
} 

但它會更好地使用先生失望的答案。

0

要忽略所有異常:

try { 
    // Your code. 
} 
catch { 
} 

要忽略只是特定類型的異常:

try { 
    // Your code. 
} 
catch (SpecificException) { 
} 
+0

你應該只是捕捉所有的例外。只有抓住你認識的人可能會被提出,你可以在這個代碼中處理。讓其餘的泡沫起來。 – ChrisF

0
public MWRichTextBox() : base() { 

     // Initialize default text and background colors 
     textColor = RtfColor.Black; 
     highlightColor = RtfColor.White; 
     try 
     { 
     // Initialize the dictionary mapping color codes to definitions 
     rtfColor = new HybridDictionary(); 
     rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua); 
     rtfColor.Add(RtfColor.Black, RtfColorDef.Black); 
     rtfColor.Add(RtfColor.Blue, RtfColorDef.Blue); 
     rtfColor.Add(RtfColor.Fuchsia, RtfColorDef.Fuchsia); 
     rtfColor.Add(RtfColor.Gray, RtfColorDef.Gray); 
     rtfColor.Add(RtfColor.Green, RtfColorDef.Green); 
     rtfColor.Add(RtfColor.Lime, RtfColorDef.Lime); 
     rtfColor.Add(RtfColor.Maroon, RtfColorDef.Maroon); 
     rtfColor.Add(RtfColor.Navy, RtfColorDef.Navy); 
     rtfColor.Add(RtfColor.Olive, RtfColorDef.Olive); 
     rtfColor.Add(RtfColor.Purple, RtfColorDef.Purple); 
     rtfColor.Add(RtfColor.Red, RtfColorDef.Red); 
     rtfColor.Add(RtfColor.Silver, RtfColorDef.Silver); 
     rtfColor.Add(RtfColor.Teal, RtfColorDef.Teal); 
     rtfColor.Add(RtfColor.White, RtfColorDef.White); 
     rtfColor.Add(RtfColor.Yellow, RtfColorDef.Yellow); 
     rtfColor.Add(RtfColor.WhiteSmoke, RtfColorDef.WhiteSmoke); 

     // Initialize the dictionary mapping default Framework font families to 
     // RTF font families 
     rtfFontFamily = new HybridDictionary(); 
     rtfFontFamily.Add(FontFamily.GenericMonospace.Name, RtfFontFamilyDef.Modern); 
     rtfFontFamily.Add(FontFamily.GenericSansSerif, RtfFontFamilyDef.Swiss); 
     rtfFontFamily.Add(FontFamily.GenericSerif, RtfFontFamilyDef.Roman); 
     rtfFontFamily.Add(FF_UNKNOWN, RtfFontFamilyDef.Unknown); 
     } 
     catch 
     { 
     } 
     // Get the horizontal and vertical resolutions at which the object is 
     // being displayed 
     using(Graphics _graphics = this.CreateGraphics()) { 
      xDpi = _graphics.DpiX; 
      yDpi = _graphics.DpiY; 
     } 
    } 
2

即使你包裝你的代碼放到一個嘗試捕捉後的代碼塊拋出異常的行將不會被執行,但只有catch/finally塊中的代碼將被執行,所以你應該包裝所有的.Add語句(這真的很糟糕) 你應該始終防止你的代碼拋出異常,什麼時候有可能你應該避免它。怎麼樣創建一個方法(或擴展方法)來檢查項目是否已經存在數組中,並且它不是該項目將被添加? 看看下面的詞典擴展方法也適用於任何字典

public static class DictionaryExtension 
    { 
     public static void AddItemIfNotExist<TKey,TValue>(this Dictionary<TKey,TValue> dictionary, TKey key,TValue item) 
     { 
      if (!dictionary.ContainsKey(key)) 
      { 
       dictionary.Add(key, item); 
      } 
     } 
    } 
+0

我是否需要每一個(鑰匙,項目)或我可以一次使用它? – user932742

+0

你需要使用如果每次(基本上它代替正常的.Add()) –

+0

我真的很抱歉,你正在處理初學者初學者級別,我在哪裏創建這個類?公共MWRichTextBox():base()類之前? – user932742

0

相反的try/catch的工作,只是檢查,如果字典包含已關鍵:

if(!rtfColor.ContainsKey(RtfColor.Aqua)) 
{ 
    rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua); 
} 

與包裝的問題try/catch中的所有內容都是在拋出異常之後你會錯過任何你試圖添加的值。

+0

我可以一次做到這一點嗎 if(!rtfColor.ContainsKey(RtfColor.Aqua,RtfColor.Blue,....)) { rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua); } user932742

+0

nope,除非你能以某種方式遍歷值。 – Erix

1

你可以只添加一個try-catch塊周圍整個事情就像這樣:

try 
    { 
     // Your code inside here 
    } 
    catch (Exception e) 
    { 
     // do nothing and be silent 
    } 

但我必須說,我不推薦這種方法。仔細查看你的代碼,並尋找一種更好的更穩定的方法,而不僅僅是無聲地吞嚥一個錯誤。

0

你不行。問題是如果你得到一個異常,你會被拋出嘗試序列。要麼你將不得不把try /在所有的呼叫前捕捉到。新增方法,或嘗試做一個更elgant方式,這就是:

  1. 表所有RtfColor/RtfColorDef的字典對。
  2. 使用foreach循環遍歷它。在foreach的主體中,檢查你正在檢查的對是否已經在rtfColor中。在這種情況下,只需要一次嘗試/捕獲。確保你把catch {繼續; }。
+0

這不是我的代碼我們的程序員搬到了不同的公司,我只是一個新手,我不知道如果我把所有的電話前面的try/catch都形成一個新的字典會不會搞砸了什麼,那會工作? 嘗試 rtfColor.Add(RtfColor.Aqua,RtfColorDef.Aqua); } catch(例外) { throw; } 這裏有什麼例外? – user932742

+0

它會好的。前進。 –