MatchError — 패턴 매칭이 실패할 때

MatchError — 패턴 매칭이 실패할 때

Elixir에서 =는 단순 대입이 아니라 패턴 매칭(pattern match)이에요. 그런데 오른쪽 값이 패턴에 맞지 않으면 어떻게 될까요? 그때 던져지는 예외가 바로 MatchError예요.

출처: MatchError

본문

MatchError는 패턴 매칭(=/2)이 실패할 때 발생하는 예외예요. 예를 들어 볼게요:

iex> [_ | _] = []
** (MatchError) no match of right hand side value:
...

빈 리스트 [][_ | _](머리와 꼬리가 하나 이상 있어야 하는 패턴)에 맞지 않아요. 그래서 Elixir는 예외를 던지고, "오른쪽 값(right hand side value)에 매칭되는 게 없다"고 알려 주죠.

이 예외의 다음 필드는 public이라서 자유롭게 접근할 수 있어요:

  • :term (term/0) — 패턴과 매칭에 실패한 값

패턴 매칭이 실패했을 때 "어떤 값이 매칭에 실패했는가"를 알고 싶다면 MatchError:term 필드를 보면 돼요. 이 예외를 rescue에서 받아 원하는 처리를 하거나, 실패 원인을 로그로 남기는 데 유용해요.

패턴 매칭은 Elixir 곳곳에서 등장해요. 함수 인자, case의 각 절(clause), with의 각 단계, 그리고 구조 분해(destructuring) 모두 패턴 매칭이에요. 패턴이 강력한 만큼, 패턴에 맞지 않는 값이 들어오면 MatchError를 만나게 되죠. 예를 들어 {:ok, result} = fetch_data() 같은 코드에서 fetch_data(){:error, reason}를 돌려주면 역시 MatchError가 발생해요. 그래서 "성공뿐 아니라 실패도 예상되는 경우"에는 무작정 =로 받기보다 casewith로 분기를 나누는 게 더 안전해요.

case fetch_data() do
  {:ok, result} -> # 성공 처리
  {:error, reason} -> # 실패 처리
end

MatchError는 이런 "패턴이 안 맞는" 상황을 명확한 예외로 알려 줘서, 실수를 조기에 발견하게 도와줘요.

더 알아보기

  • =/2 패턴 매칭 연산자와 Pattern matching 가이드
  • Kernelcase, with, 함수 헤더의 패턴 매칭
  • try/rescue — 예외를 잡아 처리하는 문법