2011-09-07 4 views
1

Je suis nouveau en C# et je n'ai jamais essayé de créer un bloc try catch, j'obtiens une erreur où l'erreur indique "Une clé existe déjà" dans l'un des HybridDictionary, Comment puis-je mettre les .Adds dans un essai bloc catch et l'ignorer si la clé existe déjà:Try Catch Block

est ici le code d'origine avec les 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

Est-il essentiel que cela se passe dans un bloc try catch? J'essaie de les éviter quand c'est nécessaire, et c'est nécessaire. À mon avis, il serait préférable de vérifier si une entrée existe dans la collection avant de l'ajouter. – hdougie

+0

Chaque fois qu'une exception est ignorée, un chaton meurt. Do _not_ utilise 'try' /' catch' pour supprimer les erreurs. Utilisez-le pour les erreurs _handle_ et _report_. – David

Répondre

16

Comme alternative à un fourre-tout qaundary, je vous suggère vérifier si l'élément existe via la clé au moyen de la méthode Contains. Par exemple:

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

Prenons un peu plus loin pour illustrer la suggestion de Jim B (puisque ce fait introduisons des lignes supplémentaires par ajout et pourrait rapidement devenir écrasante), nous pouvons créer une méthode simple pour « ajouter des éléments en toute sécurité », qui est, ajouter des éléments à la collection que si un élément n'existe pas déjà avec une clé spécifique (vous pouvez appliquer une plus grande spécificité en termes de dénomination de la méthode et l'accès etc, mais comme un exemple):

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); 

Cela pourrait être étendu plutôt simplement pour faire la mise à jour, si nécessaire. Quand utiliser try/catch est une autre histoire, quand utiliser try/catch pour ignorer les erreurs est une autre durée de vie.

+6

Certainement préfèrent cette façon de le faire. Créez une méthode appelée AddToDictionary(), qui vérifie si la clé existe. Si ce n'est pas le cas ajoutez-le. Si c'est le cas, soit sauter ou mettre à jour. –

+0

Nous vous remercions de votre aide @M. Déception, où devrais-je créer cette méthode juste après avoir créé le HybridDictionary? – user932742

+0

@ user932742 Vous pouvez placer la méthode dans la classe du contrôle elle-même - vous ne la définissez pas dans le corps de la méthode en utilisant 'HybridDictionary', mais en dehors de celle-ci, et réutilisez le code en l'appelant par name (et en fournissant les arguments pour les paramètres) si nécessaire. –

0

Il faudrait entourer chaque ajouter comme ceci:

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

Mais il serait préférable d'utiliser la réponse de M. Déception.

0

Pour ignorer toutes les exceptions:

try { 
    // Your code. 
} 
catch { 
} 

simplement ignorer une exception du type:

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

Vous devriez toujours attraper toutes les exceptions. Seulement attraper ceux que vous connaissez peuvent être soulevées et vous pouvez traiter avec ce code. Laisse le reste se gonfler. – 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

même si vous enveloppez votre code dans un bloc capture essayer le code après la la ligne qui lève l'exception ne sera pas exécutée mais seulement le code dans le bloc catch/finally sera exécuté, donc vous devriez envelopper toutes les instructions .Add (ce qui serait vraiment très mauvais) Vous devriez toujours empêcher votre code de lancer une exception et quand c'est possible, vous devriez l'éviter. Qu'en est-il de la création d'une méthode (ou d'une méthode d'extension) qui vérifie si l'élément existe déjà dans le tableau et si ce n'est pas le cas, l'élément sera ajouté? un coup d'oeil à la méthode ci-dessous de l'extension du dictionnaire, il fonctionnera pour tout dictionnaire

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

Ai-je besoin de cette chaque (clé, élément) ou puis-je utiliser pour tout à la fois? – user932742

+0

vous devez utiliser si à chaque fois (fondamentalement, il remplace le normal .Add()) –

+0

Je suis vraiment désolé que vous avez affaire à un niveau débutant débutant, où puis-je créer cette classe? avant le public MWRichTextBox(): base() classe? – user932742

0

Au lieu de try/catch, juste vérifier si le dictionnaire contient la clé déjà:

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

Le problème avec emballage le tout dans un essai/catch est que vous manquerez toutes les valeurs que vous avez essayé d'ajouter après celui qui lance l'exception.

+0

Puis-je faire cela pour tous à la fois comme if(!rtfColor.ContainsKey(RtfColor.Aqua,RtfColor.Blue,....)) { rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua); } user932742

+0

non, sauf si vous pouvez en quelque sorte faire défiler les valeurs . Ce – Erix

1

Vous pouvez simplement ajouter un bloc try-catch autour de la chose comme ceci:

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

Mais je dois dire que Je ne recommande pas cette approche. Regardez dans votre code et cherchez une meilleure approche plus stable que d'avaler silencieusement une erreur.

0

Vous ne pouvez pas. Le problème est que si vous obtenez une exception, vous serez expulsé de la séquence d'essai. Soit vous devrez mettre try/catch devant tous les appels à une méthode .Add ou essayer de le faire d'une manière plus elgant, qui est:

  1. forme un dictionnaire de tous vos RtfColor/RtfColorDef paires.
  2. Itérer à travers elle avec une boucle foreach. Dans le corps de foreach, vérifiez si la paire que vous vérifiez est déjà dans le rtfColor. Un seul essai/catch sera requis dans ce cas. Assurez-vous de mettre catch (continuez; }
+0

mon code notre programmeur déplacé à une autre société et je suis juste un débutant, je ne sais pas si la formation d'un nouveau dictionnaire sera bousiller quoi que ce soit ou non, si je mets try/catch devant tous les appels comment ça va travailler? essayez { rtfColor.Add (RtfColor.Aqua, RtfColorDef.Aqua); } attraper (exception) { lancer; } Quel serait l'exception ici? – user932742

+0

Ça va aller. Aller de l'avant. –