Enum.OutOfBoundsError 예외

Enum.OutOfBoundsError 예외

함수가 열거형이 어느 정도의 크기를 갖고 있다고 기대했는데, 실제로는 너무 작아서 요청한 위치에 도달하지 못할 때 발생하는 예외예요. 인덱스를 벗어났다는 뜻으로 "out of bounds"라는 이름이 붙었어요.

예를 들어 3개의 원소가 있는 리스트에서 5번째 위치를 강제로 꺼내려고 하면 다음처럼 에러가 떠요.

iex> Enum.fetch!([1, 2, 3], 5)
** (Enum.OutOfBoundsError) out of bounds error at position 5 when traversing enumerable [1, 2, 3]

출처: Enum.OutOfBoundsError exception

본문

이 예외는 주로 Enum 모듈에서 인덱스를 직접 다루는 함수들이 사용해요. 예를 들어 Enum.at/2와 함께 쓰이는 Enum.fetch!/2는 인덱스를 주면 그 위치의 값을 돌려주는데, 리스트 길이보다 큰 인덱스를 요청하면 값을 만들 수 없으니 이 예외를 던져요.

메시지를 보면 어디가 문제인지 금방 알 수 있도록, 몇 번째 위치(position 5)였는지어떤 열거형([1, 2, 3])을 다루다가 실패했는지를 함께 알려줘요. 덕분에 어느 데이터의 어떤 인덱스에서 문제가 났는지 추적하기 쉬워요.

해당 예외를 직접 만들 때 참고할 수 있는 헬퍼도 있어요.

  • message(index, enumerable) — 인덱스와 열거형을 받아 이 예외의 에러 메시지를 만들어 주는 함수예요. 직접 예외를 던질 때 메시지를 만들고 싶다면 이용할 수 있어요.

더 알아보기

  • Enum.at/2Enum.fetch!/2의 차이점을 이해하면, "안전하게 값을 꺼낼지 vs 없으면 에러를 낼지"를 상황에 맞게 선택할 수 있어요.
  • 인덱스가 벗어났을 때 nil을 돌려주는 Enum.at/2 같은 함수와 비교해 보면 예외의 쓰임새가 더 선명해져요.
  • 예외 처리에 대한 전반적인 내용은 Kernel의 예외 관련 함수(raise, rescue) 문서를 참고해 보세요.