`CondClauseError`
CondClauseError
cond/1 표현식의 어떤 절도 truthy한 값으로 평가되지 않았을 때 발생하는 예외예요.
예를 들어 다음처럼 cond/1을 쓰면 이 예외가 발생합니다:
iex> cond do
...> 1 + 1 == 3 -> :woah
...> nil -> "yeah this won't happen"
...> end
** (CondClauseError) no cond clause evaluated to a truthy value
출처:
CondClauseError
본문
cond/1은 여러 조건을 차례로 평가해, 처음으로 참이 되는 조건에 해당하는 분기를 실행하는 도구예요. if/else가 참/거짓 두 갈래만 다룬다면, cond는 "이 조건이 참이면 이걸, 아니면 다음 조건을 확인"하는 식으로 여러 후보를 순서대로 살펴요.
그런데 cond에는 중요한 규칙이 하나 있어요. 여러 절 중에 반드시 하나는 참이어야 한다는 겁니다. 위 예시에서 첫 번째 절 1 + 1 == 3은 거짓이고, 두 번째 절 nil도 Elixir에서 falsy한 값이라서 참이 아니에요. 결국 어떤 절도 truthy한 값으로 평가되지 않았고, 그래서 CondClauseError가 발생했죠.
이 예외가 말해주는 핵심은 사실 간단해요. "어느 조건도 충족되지 않았다"는 것. 이는 곧 작성한 조건 집합이 실제 상황을 완전히 덮지 못했다는 뜻이에요.
피하는 방법도 똑같이 단순합니다. cond의 마지막에는 항상 조건을 true로 둔 절, 즉 "무슨 일이 있어도 실행되는" 기본 분기를 두는 게 안전해요. 모든 조건이 거짓일 때 도달할 곳이 마련돼 있으면 이 예외가 발생할 일이 없어지죠. 이런 마지막 절을 fallback(폴백) 절이라고 부르기도 해요.
조건이 아무리 많아도 항상 참이 되는 것은 절대 없으니, cond/1을 쓸 때는 "혹시 모두 거짓이 되면 어떻게 하지?"를 미리 생각해 두는 습관이 좋습니다.
더 알아보기
cond/1의 정확한 문법과 평가 순서는 Elixir 공식 문서의Kernel.cond/1을 참고하세요.case/2에서 비슷한 상황에 발생하는 예외는CaseClauseError를 참고하세요.- Elixir에서 truthy와 falsy한 값이 무엇인지는 튜토리얼의 조건문 부분에서 다룹니다.