2014-10-07 217 views
37

有沒有一種方法可以在影響所有泛型類的方式下以C#中的以下異常獲取給定鍵的值?我認爲這是微軟在例外描述中的一個大錯失。給定的密鑰不在字典中。哪把鑰匙?

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

一個更好的辦法是:

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

解決方案可能涉及混入或派生類可能。

+11

這個問題似乎是無關緊要的,因爲它是關於實現異常消息的咆哮,而不是編程問題。 – Servy 2014-10-07 20:08:37

+1

當然,您可以使用調試器來查明確切的上下文,從而找到密鑰。 – Mephy 2014-10-07 20:09:25

+6

問題在於,調試器並不總是可用的,例如在讀取日誌文件時。 – Andreas 2014-10-07 20:10:47

回答

10

在一般情況下,答案是否定的

但是,您可以設置調試器在其中異常被拋出第一點破門。那時,不存在的密鑰將作爲調用堆棧中的值訪問。

在Visual Studio中,該選項位於:

調試→例外... →公共語言運行庫異常→ System.Collections.Generic

在那裏,你可以檢查時拋出框。


對於需要在運行時信息更加具體的實例,提供您的代碼使用IDictionary<TKey, TValue>和不直接依賴於Dictionary<TKey, TValue>,你可以實現自己的字典類,它提供這種行爲。

+0

這通常是我如何運行我的調試器 – AaronLS 2014-10-07 20:11:06

+0

Hi @Sam,你在調用堆棧的哪個點找到這個值? – user919426 2015-08-07 05:26:53

+0

VS 2017(v15.5.7)具有它:調試 - > Windows - >異常設置 - >然後檢查System.Collections.Generic.KeyNotFoundException – 2018-02-27 20:21:09

4

如果要管理的關鍵失誤,你應該使用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."); 
} 
+0

這假定它的密鑰的預期用法不在那裏。可能並非如此,它可能是一個例外情況 – Servy 2014-10-07 20:11:52

+0

非常感謝你 – 2017-12-20 03:24:17

37

當您試圖索引的東西,是不是有這種異常被拋出,例如:

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

微軟選擇不這樣做,可能是因爲它在大多數物體上使用時沒用。它很簡單,可以自己做,所以只需要自己推出!

+11

做'ContainsKey',那麼索引器將導致兩個查找字典。做一個'TryGetValue'只能是一次查找,你可以用布爾輸出來選擇你的if/else塊。 – 2014-10-07 20:30:29

+1

@ScottChamberlain非常真實。作爲附加實現添加。 – BradleyDotNET 2014-10-07 20:33:23

+0

嘗試返回布爾值的test.keys.contains(key)。 – Kurkula 2015-04-03 20:35:12

相關問題