有沒有一種方法可以在影響所有泛型類的方式下以C#中的以下異常獲取給定鍵的值?我認爲這是微軟在例外描述中的一個大錯失。給定的密鑰不在字典中。哪把鑰匙?
"The given key was not present in the dictionary."
一個更好的辦法是:
"The given key '" + key.ToString() + "' was not present in the dictionary."
解決方案可能涉及混入或派生類可能。
有沒有一種方法可以在影響所有泛型類的方式下以C#中的以下異常獲取給定鍵的值?我認爲這是微軟在例外描述中的一個大錯失。給定的密鑰不在字典中。哪把鑰匙?
"The given key was not present in the dictionary."
一個更好的辦法是:
"The given key '" + key.ToString() + "' was not present in the dictionary."
解決方案可能涉及混入或派生類可能。
在一般情況下,答案是否定的
但是,您可以設置調試器在其中異常被拋出第一點破門。那時,不存在的密鑰將作爲調用堆棧中的值訪問。
在Visual Studio中,該選項位於:
調試→例外... →公共語言運行庫異常→ System.Collections.Generic
在那裏,你可以檢查時拋出框。
對於需要在運行時信息更加具體的實例,提供您的代碼使用IDictionary<TKey, TValue>
和不直接依賴於Dictionary<TKey, TValue>
,你可以實現自己的字典類,它提供這種行爲。
這通常是我如何運行我的調試器 – AaronLS 2014-10-07 20:11:06
Hi @Sam,你在調用堆棧的哪個點找到這個值? – user919426 2015-08-07 05:26:53
VS 2017(v15.5.7)具有它:調試 - > Windows - >異常設置 - >然後檢查System.Collections.Generic.KeyNotFoundException – 2018-02-27 20:21:09
如果要管理的關鍵失誤,你應該使用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.");
}
這假定它的密鑰的預期用法不在那裏。可能並非如此,它可能是一個例外情況 – Servy 2014-10-07 20:11:52
非常感謝你 – 2017-12-20 03:24:17
當您試圖索引的東西,是不是有這種異常被拋出,例如:
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));
微軟選擇不這樣做,可能是因爲它在大多數物體上使用時沒用。它很簡單,可以自己做,所以只需要自己推出!
做'ContainsKey',那麼索引器將導致兩個查找字典。做一個'TryGetValue'只能是一次查找,你可以用布爾輸出來選擇你的if/else塊。 – 2014-10-07 20:30:29
@ScottChamberlain非常真實。作爲附加實現添加。 – BradleyDotNET 2014-10-07 20:33:23
嘗試返回布爾值的test.keys.contains(key)。 – Kurkula 2015-04-03 20:35:12
這個問題似乎是無關緊要的,因爲它是關於實現異常消息的咆哮,而不是編程問題。 – Servy 2014-10-07 20:08:37
當然,您可以使用調試器來查明確切的上下文,從而找到密鑰。 – Mephy 2014-10-07 20:09:25
問題在於,調試器並不總是可用的,例如在讀取日誌文件時。 – Andreas 2014-10-07 20:10:47