Данный ключ отсутствовал в словаре. Какой ключ?
Есть ли способ получить значение данного ключа в следующем исключении в С# таким образом, который влияет на все общие классы? Я думаю, что это большая ошибка в описании исключения из Microsoft.
"The given key was not present in the dictionary."
Лучший способ:
"The given key '" + key.ToString() + "' was not present in the dictionary."
Решения могут включать миксины или производные классы.
Ответы
Ответ 1
Это исключение генерируется при попытке индексировать то, что там не существует, например:
Dictionary<String, String> test = new Dictionary<String,String>();
test.Add("Key1,"Value1");
string error = test["Key2"];
Часто, что-то вроде объекта будет ключом, что, несомненно, затрудняет его получение. Однако вы всегда можете написать следующее (или даже завершить его в методе расширения):
if (test.ContainsKey(myKey))
return test[myKey];
else
throw new Exception(String.Format("Key {0} was not found", myKey));
Или более эффективный (благодаря @ScottChamberlain)
T retValue;
if (test.TryGetValue(myKey, out retValue))
return retValue;
else
throw new Exception(String.Format("Key {0} was not found", myKey));
Microsoft решила не делать этого, вероятно, потому, что это было бы бесполезно при использовании на большинстве объектов. Его достаточно просто сделать сами, так что просто бросьте свои собственные!
Ответ 2
В общем случае ответ No.
Тем не менее, вы можете настроить отладчик на разрыв в точке, где первое исключение. В то время ключ, который отсутствовал, будет доступен как значение в стеке вызовов.
В Visual Studio эта опция находится здесь:
Debug → Исключения... → Исходные данные об общедоступном языке Runtime → System.Collections.Generic
Здесь вы можете проверить флажок Брошенный.
Для более конкретных случаев, когда информация требуется во время выполнения, если ваш код использует IDictionary<TKey, TValue>
и не привязан непосредственно к Dictionary<TKey, TValue>
, вы можете реализовать свой собственный класс словаря, который обеспечивает это поведение.
Ответ 3
Если вы хотите управлять промахами ключей, вы должны использовать 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.");
}
Ответ 4
Вы можете попробовать этот код
Dictionary<string,string> AllFields = new Dictionary<string,string>();
string value = (AllFields.TryGetValue(key, out index) ? AllFields[key] : null);
Если ключ отсутствует, он просто возвращает нулевое значение.
Ответ 5
int value = ((OptionSetValue)orgEntity.Attributes["negativecurrencyformatcode"]).Value;
ОШИБКА: данный ключ отсутствует в словаре.
Ответ 6
string Value = dic.ContainsKey("Name") ? dic["Name"] : "Required Name"
С помощью этого кода мы получим строковые данные в "Значение". Если ключ "Name" существует в словаре "dic", извлеките это значение, в противном случае возвращает строку "Required Name".