WithClauseError 예외

WithClauseError 예외

with를 사용할 때, 그 표현식 안의 어떤 값도 else 절에 매칭되지 않으면 어떻게 될까요? 이 예외는 바로 그 상황에서 발생해요. with/1 표현식의 한 값이 else에 정의된 -> 절 중 어느 것과도 매칭되지 않을 때 던져지는 예외예요.

출처: WithClauseError exception (Elixir v1.20.4)

본문

WithClauseErrorwith/1 표현식에서 어떤 값이 else에 정의된 -> 절 중 어느 것과도 매칭되지 않을 때 발생하는 예외예요.

예를 들어 아래 코드처럼 with {:ok, 1} <- {:ok, 2}에서 {:ok, 2} 값이 else:error{:error, _} 절과 매칭되지 않으면 이 예외가 던져져요.

iex> with {:ok, 1} <- {:ok, 2} do
...>   :woah
...> else
...>   :error -> :error
...>   {:error, _} -> :error
...> end
** (WithClauseError) no with clause matching:
...

이 예외는 다음과 같은 공개 필드를 가지며, 자유롭게 접근할 수 있어요.

  • :term (term/0) - 어떤 절에도 매칭되지 않은 값이에요.

withelse 절은 패턴 매칭이 실패했을 때만 실행돼요. 즉 정상적으로 with의 각 <-가 모두 매칭된 경우에는 do 블록이 실행되고, 그 중 하나라도 실패하면 실패한 값이 else에 넘겨져 매칭을 시도해요. 그런데 else에 정의된 절 중 어느 것도 그 값과 맞지 않으면 매칭에 실패한 것 그대로 예외가 던져지는 거예요.

이 예외를 피하려면 else 절이 실패로 들어올 수 있는 모든 값을 커버해야 해요. 기능상 실패 값의 형태를 빠짐없이 열거하거나, 맨 아래에 _ -> ... 같은 나머지(wildcard) 절을 두어 어떤 값이 와도 처리되도록 하는 게 일반적인 방법이에요. 이렇게 하면 "아무 절에도 걸리지 않아 예외가 나는" 상황을 줄일 수 있어요.

더 알아보기