Existe-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 un gros manque dans la description de l'exception de Microsoft.
"The given key was not present in the dictionary."
Une meilleure façon serait:
"The given key '" + key.ToString() + "' was not present in the dictionary."
Les solutions peuvent impliquer des mixins ou des classes dérivées peut-être.
Cette exception est levée lorsque vous essayez d'indexer quelque chose qui n'existe pas, par exemple:
Dictionary<String, String> test = new Dictionary<String,String>();
test.Add("Key1,"Value1");
string error = test["Key2"];
Souvent, quelque chose comme un objet sera la clé, ce qui rend sans aucun doute plus difficile à obtenir. Cependant, vous pouvez toujours écrire ce qui suit (ou même l'envelopper avec une méthode d'extension):
if (test.ContainsKey(myKey))
return test[myKey];
else
throw new Exception(String.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(String.Format("Key {0} was not found", myKey));
Microsoft a choisi de ne pas le faire, probablement parce que cela ne servirait à rien s'il est utilisé sur la plupart des objets. C'est assez simple à faire soi-même, alors roulez les vôtres!
Dans le cas général, la réponse est non.
Cependant, vous pouvez configurer le débogueur pour qu'il se termine au moment où l'exception est levée pour la première fois. À ce moment, la clé qui n'était pas présente sera accessible en tant que valeur dans la pile d'appels.
Dans Visual Studio, cette option se trouve ici:
Débogage → Exceptions ... → Exceptions du Common Language Language → System.Collections.Generic
Là, vous pouvez cocher la case Jeté .
Pour des cas plus spécifiques où des informations sont nécessaires au moment de l'exécution, à condition que votre code utilise IDictionary<TKey, TValue>
et non lié directement à Dictionary<TKey, TValue>
, vous pouvez implémenter votre propre classe de dictionnaire offrant ce comportement.
Si vous voulez gérer les clés manquantes, vous devez utiliser TryGetValue
https://msdn.Microsoft.com/en-gb/library/bb347013(v=vs.110).aspx
string value = "";
if (openWith.TryGetValue("tif", out value))
{
Console.WriteLine("For key = \"tif\", value = {0}.", value);
}
else
{
Console.WriteLine("Key = \"tif\" is not found.");
}
Vous pouvez essayer ce code
Dictionary<string,string> AllFields = new Dictionary<string,string>();
string value = (AllFields.TryGetValue(key, out index) ? AllFields[key] : null);
Si la clé n'est pas présente, elle renvoie simplement une valeur null.