FunctionClauseError 예외
FunctionClauseError 예외
함수를 호출했는데, 그 호출이 정의된 어떤 절(clause)과도 매칭되지 않을 때 발생하는 예외예요. 패턴 매칭 기반 언어인 Elixir에서 흔히 만나는 에러죠.
예를 들어 List.duplicate/2는 두 번째 인자로 양수 개수를 기대하는데, 음수를 넘기면 매칭되는 절이 없어서 다음처럼 에러가 나요.
iex> List.duplicate(:ok, -3)
** (FunctionClauseError) no function clause matching in List.duplicate/2
본문
Elixir의 함수는 여러 절(clause)로 정의할 수 있어요. 호출이 일어나면 인자들이 각 절의 패턴과 위에서부터 순서대로 비교되는데, 어떤 절과도 맞지 않으면 이 예외가 던져져요. 위 예시처럼 List.duplicate/2에 음수 개수가 들어온 경우가 대표적이죠.
어떤 함수가 실패했는지 파악하기 위해 이 예외는 공개 필드를 제공해요.
:module(module/0) — 호출한 함수가 정의된 모듈 이름이에요.:function(atom/0) — 함수 이름이에요.:arity(non_neg_integer/0) — 함수의 인자 개수(arity)예요.
이 세 필드를 조합하면 "어느 모듈의 어떤 함수(몇 개 인자 버전)에서 매칭이 실패했는지"를 정확히 알 수 있어요. 예를 들어 위 에러는 module = List, function = :duplicate, arity = 2로 채워져 있어요.
이 예외는 보통 나만의 함수에서도 쉽게 만나요. 가드 조건이나 패턴이 너무 좁게 정의되어 있을 때, 예상 밖의 인자가 들어오면 "no function clause matching" 에러가 떠요. 그럴 때는 해당 함수에 빠진 케이스(가령 빈 리스트, nil, 기본값 등)를 처리하는 절을 추가해 주면 해결돼요.
더 알아보기
- 함수를 여러 절로 정의하는 방법은
Kernel.SpecialForms.def/2문서를 참고해 보세요. - 가드(guard) 조건이 함수 절에 어떻게 적용되는지도 함께 확인하면 도움이 돼요.
- 예외의 공개 필드 구조는
Exception모듈 문서에서 자세히 다뤄요.