La clé donnée n’était pas présente dans le dictionnaire. Quelle clé?

Y a-t-il un moyen d’obtenir la valeur de la clé donnée dans l’exception suivante en C # d’une manière qui affecte toutes les classes génériques? Je pense que c’est une grosse erreur dans la description des exceptions de Microsoft.

"The given key was not present in the dictionary." 

Une meilleure façon serait:

 "The given key '" + key.ToSsortingng() + "' was not present in the dictionary." 

Les solutions peuvent impliquer des mixins ou des classes dérivées.

Cette exception est levée lorsque vous essayez d’indexer quelque chose qui n’existe pas, par exemple:

 Dictionary test = new Dictionary(); test.Add("Key1,"Value1"); ssortingng error = test["Key2"]; 

Souvent, quelque chose comme un object sera la clé, ce qui le rend sans doute plus difficile à obtenir. Cependant, vous pouvez toujours écrire ce qui suit (ou même l’envelopper dans une méthode d’extension):

 if (test.ContainsKey(myKey)) return test[myKey]; else throw new Exception(Ssortingng.Format("Key {0} was not found", myKey)); 

Ou plus efficace (grâce à @ScottChamberlain)

 T retValue; if (test.TryGetValue(myKey, out retValue)) return retValue; else throw new Exception(Ssortingng.Format("Key {0} was not found", myKey)); 

Microsoft a choisi de ne pas le faire, probablement parce qu’il serait inutile sur la plupart des objects. C’est assez simple à faire vous-même, alors lancez vous-même!

Dans le cas général, la réponse est non.

Cependant, vous pouvez définir le débogueur pour qu’il se casse au point où l’exception est lancée pour la première fois. A ce moment-là, la clé qui n’était pas présente sera accessible en tant que valeur dans la stack d’appels.

Dans Visual Studio, cette option est située ici:

Debug → Exceptions … → Exceptions Common Language Runtime → System.Collections.Generic

Là, vous pouvez cocher la case Thrown .


Pour des cas plus spécifiques où des informations sont nécessaires à l’exécution, à condition que votre code utilise IDictionary et non directement lié au Dictionary , vous pouvez implémenter votre propre classe de dictionnaire.

Si vous voulez gérer les échecs de clé, vous devez utiliser TryGetValue

https://msdn.microsoft.com/en-gb/library/bb347013(v=vs.110).aspx

 ssortingng value = ""; if (openWith.TryGetValue("tif", out value)) { Console.WriteLine("For key = \"tif\", value = {0}.", value); } else { Console.WriteLine("Key = \"tif\" is not found."); }