BadArityError
BadArityError
함수를 잘못된 개수의 인자로 호출했을 때 던져지는 예외예요. Elixir에서 함수의 인자 개수는 정확히 맞춰야 하니까, 이 예외가 튀어나오면 보통 호출 부분의 인자 수를 살펴보면 돼요.
본문
이 예외는 함수의 아리티(arity, 인자 개수)가 달라서 호출이 실패할 때 발생해요. 예를 들어 두 개의 인자를 받는 함수를 인자 하나로 호출하면 어떨까요.
my_function = fn x, y -> x + y end
my_function.(42)
** (BadArityError) #Function<41.39164016/2 in :erl_eval.expr/6> with arity 2 called with 1 argument (42)
에러 메시지를 보면 arity 2 called with 1 argument (42)라고 나와요. 즉 "이 함수는 인자를 2개 받는데, 1개만 전달됐다"는 뜻이에요. 괄호 안의 (42)는 실제로 전달된 인자의 값을 보여주죠.
이런 실수는 특히 두 가지 상황에서 자주 일어나요. 하나는 함수를 정의할 때와 호출할 때의 인자 개수를 다르게 적는 경우이고, 다른 하나는 커링(currying)을 기대하며 인자를 나눠 전달하는 경우예요. Elixir 함수는 기본적으로 커링을 지원하지 않으니, 인자 개수는 항상 시그니처에 맞게 전달해야 해요.
이 예외는 raise BadArityError처럼 직접 던질 수도 있지만, 실제로는 함수 호출 시점에 런타임이 알아서 던져 주는 편이에요. 그래서 대부분의 경우 직접 다룰 일이라기보다는, 에러 메시지를 읽고 호출부를 고치는 용도로 만나는 예외예요.
함수마다 인자 개수는 시그니처와 함께 고정되므로, 이 예외를 만나면 우선 호출한 함수가 기대하는 아리티를 꼭 확인해 보는 게 좋아요. 특히 가드나 기본 인자(default argument)로 인해 여러 시그니처를 가진 함수라면 더 헷갈리기 쉽거든요.
더 알아보기
- Function: 함수와 아리티 개념 자체에 대해
- Kernel.raise/2: 예외를 직접 던지는 방법
- Elixir 예외와 에러: try/rescue 등 예외 처리 전반