KeyError 예외

KeyError 예외

KeyError는 데이터 구조에서 키를 찾지 못했을 때 던져지는 예외예요. 맵이나 키워드 리스트에서 존재하지 않는 키를 강제로 꺼내려 할 때 이 예외를 만나요.

iex> map = %{name: "Alice", age: 25}
iex> Map.fetch!(map, :first_name)
** (KeyError) key :first_name not found in: %{age: 25, name: "Alice"}

원문 보충: Map.fetch!/2는 주어진 키가 맵에 없으면 KeyError를 던져요. 키워드 리스트에도 같은 방식으로 적용되고, 점(.) 표기법(map.key)이나 구조체 필드 접근도 내부적으로 키 조회라서 마찬가지예요.

출처: KeyError

본문

KeyError는 맵, 구조체, 키워드 리스트 같은 데이터 구조에서 원하는 키를 찾지 못했을 때 던져지는 예외입니다. !가 붙은 함수들(Map.fetch!/2, Access.fetch!/2 등)이 키를 강제로 조회하면서 실패하면 발생해요.

이 예외는 다음과 같은 공개 필드를 자유롭게 읽을 수 있어요.

  • :term (t:term/0) — 조회했던 데이터 구조 자체
  • :key (t:term/0) — 찾지 못한 키
try do
  Map.fetch!(%{a: 1}, :b)
rescue
  e in KeyError ->
    IO.puts("키 #{inspect(e.key)} 를 #{inspect(e.term)}에서 못 찾았어요")
end

:term은 어떤 구조를 뒤졌는지, :key는 무엇을 찾았는지를 알려주기 때문에 예외 메시지를 만들거나 디버깅할 때 유용해요. 키워드 리스트처럼 키 중복이 가능한 구조에서는 첫 번째 일치 항목을 기준으로 키가 있다고 보는 점도 참고하면 좋아요.

fetch! 같은 강제 조회 대신 Map.fetch/2(성공·실패를 튜플로 반환)나 Map.get/3(기본값 반환)을 쓰면 예외 자체를 피할 수 있어요.

더 알아보기

  • Map.fetch!/2: 키를 강제로 조회해 없으면 KeyError를 던지는 함수
  • Access.fetch!/2: 접근 문법에서 쓰이는 강제 조회 동작
  • Map.get/3, Keyword.get/3: 기본값을 돌려주는 안전한 조회 함수