WithClauseError 예외
WithClauseError 예외
with를 사용할 때, 그 표현식 안의 어떤 값도 else 절에 매칭되지 않으면 어떻게 될까요? 이 예외는 바로 그 상황에서 발생해요. with/1 표현식의 한 값이 else에 정의된 -> 절 중 어느 것과도 매칭되지 않을 때 던져지는 예외예요.
본문
WithClauseError는 with/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) - 어떤 절에도 매칭되지 않은 값이에요.
with의 else 절은 패턴 매칭이 실패했을 때만 실행돼요. 즉 정상적으로 with의 각 <-가 모두 매칭된 경우에는 do 블록이 실행되고, 그 중 하나라도 실패하면 실패한 값이 else에 넘겨져 매칭을 시도해요. 그런데 else에 정의된 절 중 어느 것도 그 값과 맞지 않으면 매칭에 실패한 것 그대로 예외가 던져지는 거예요.
이 예외를 피하려면 else 절이 실패로 들어올 수 있는 모든 값을 커버해야 해요. 기능상 실패 값의 형태를 빠짐없이 열거하거나, 맨 아래에 _ -> ... 같은 나머지(wildcard) 절을 두어 어떤 값이 와도 처리되도록 하는 게 일반적인 방법이에요. 이렇게 하면 "아무 절에도 걸리지 않아 예외가 나는" 상황을 줄일 수 있어요.