C# KeyNotFoundException이란?
KeyNotFoundException은 Dictionary 컬렉션에서 존재하지 않는 키로 값을 조회하려고 할 때 발생하는 예외입니다. C#의 Dictionary<TKey, TValue>는 인덱서([])를 사용해 특정 키에 해당하는 값에 접근하는데, 이때 해당 키가 사전에 등록되어 있지 않으면 런타임에 이 예외가 던져집니다.
예를 들어, 사전에 "TV"와 "Laptop"이라는 키만 저장되어 있는 상태에서 "Pen Drive"라는 키로 값을 읽으려고 하면 KeyNotFoundException이 발생합니다.
KeyNotFoundException 발생 예제
다음 코드는 존재하지 않는 키에 접근하여 예외가 발생하는 상황을 보여줍니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
try {
var dict = new Dictionary<string, string>() {
{"TV", "Electronics"},
{"Laptop", "Computers"},
};
// 사전에 없는 키 "Pen Drive"로 접근 → 예외 발생
Console.WriteLine(dict["Pen Drive"]);
}
catch (Exception e) {
Console.WriteLine(e);
}
}
}위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다. 요청한 키가 Dictionary에 존재하지 않기 때문에 KeyNotFoundException 오류 메시지가 출력됩니다.
실행 결과
System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. at System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (TKey key) [0x0001e] in <902ab9e386384bec9c07fa19aa938869>:0
KeyNotFoundException 해결 방법
이 예외를 방지하려면 키에 접근하기 전에 반드시 해당 키의 존재 여부를 확인해야 합니다. 대표적인 해결 방법은 다음과 같습니다.
1. ContainsKey()로 키 존재 여부 확인
if (dict.ContainsKey("Pen Drive")) {
Console.WriteLine(dict["Pen Drive"]);
} else {
Console.WriteLine("키가 존재하지 않습니다.");
}2. TryGetValue() 사용 (권장)
TryGetValue()는 한 번의 조회로 키 존재 여부와 값을 동시에 확인할 수 있어 성능 면에서도 더 효율적입니다.
if (dict.TryGetValue("Pen Drive", out string value)) {
Console.WriteLine(value);
} else {
Console.WriteLine("키가 존재하지 않습니다.");
}정리
KeyNotFoundException은 Dictionary에서 존재하지 않는 키로 인덱서를 통해 접근할 때 발생합니다. 이를 예방하려면 ContainsKey() 또는 TryGetValue()를 활용해 키 존재 여부를 먼저 확인하는 습관을 들이는 것이 좋습니다. 특히 TryGetValue()는 불필요한 이중 조회를 피할 수 있어 실무에서 가장 널리 권장되는 방식입니다.