`CaseClauseError`
CaseClauseError
case/2 표현식에 전달된 항(term)이 정의된 어떤 -> 절(clause)과도 일치하지 않을 때 발생하는 예외예요.
예를 들어 다음처럼 실행하면 이 예외를 만날 수 있어요:
iex> case System.unique_integer() do
...> bin when is_binary(bin) -> :oops
...> :ok -> :neither_this_one
...> end
** (CaseClauseError) no case clause matching:
...
이 예외의 다음 필드는 공개 필드라서 자유롭게 접근할 수 있어요:
:term(t:term/0) — 어떤 절과도 일치하지 않은 그 항
출처:
CaseClauseError
본문
case는 여러 가능한 값 중 하나에 따라 다른 처리를 하고 싶을 때 쓰는 분기 도구예요. 그런데 정작 일치하는 분기가 하나도 없으면 Elixir는 무엇을 해야 할까요? 아무것도 하지 않고 조용히 넘어가는 대신, "어느 분기도 맞지 않았다"는 사실을 예외로 알려줘요. 이게 바로 CaseClauseError입니다.
이 예외가 발생하는 핵심 상황은 단순해요. case의 인자로 들어온 값이, 가드(guard)를 포함해 모든 절의 패턴과 일치하지 않을 때입니다. 위 예시에서도 System.unique_integer()가 반환한 값이 is_binary(bin) 가드도 통과하지 못하고 :ok도 아니어서, 결국 일치하는 절이 없어졌죠.
실전에서 이 예외는 주로 두 가지 이유로 나타나요. 하나는 패턴이 다루지 않는 새로운 값이 들어온 경우고, 다른 하나는 가드 조건 때문에 명백히 매칭돼야 할 값이 걸러진 경우예요. 특히 열거형(enum)으로 관리하는 값에 case를 쓸 때, 값의 종류가 늘어나면서 패턴을 갱신하지 않으면 자주 만나게 됩니다.
디버깅할 때는 예외에 담긴 :term 필드가 큰 도움이 돼요. "무엇이" 어느 절에도 안 맞았는지가 곧 문제의 실마리니까요. 그리고 이 예외의 모든 필드는 공개되어 있어서, e.term처럼 접근해 어떤 값이었는지 직접 확인할 수 있어요.
이 예외를 없애는 가장 확실한 방법은 case에서 다뤄야 할 모든 값을 빠짐없이 패턴으로 표현하는 거예요. 값의 종류가 명확하지 않을 때는 나중에 추가할 기본 절을 두는 것도 방법이에요.
더 알아보기
case/2자체의 문법과 가드 사용법을 다시 보고 싶다면 Elixir 공식 문서의Kernel.case/2항목을 확인해 보세요.- 가드가 패턴 매칭에 어떤 영향을 주는지는 가드(guards)에 대한 Elixir 가이드에서 더 자세히 다룹니다.
cond/1에서 비슷한 상황에 발생하는 예외는CondClauseError를 참고하세요.