BadFunctionError
BadFunctionError
함수가 기대되는 자리에 다른 값이 들어왔을 때 던져지는 예외예요. 함수를 호출하려는데 그 값이 실제 함수가 아니라면, 런타임이 이 예외를 던지면서 어떤 값을 받았는지 알려줘요.
본문
예를 들어 문자열 "hello"를 변수에 담고, 마치 함수인 것처럼 value.()로 호출해 볼게요.
iex> value = "hello"
iex> value.()
** (BadFunctionError) expected a function, got: "hello"
에러 메시지가 "함수가 와야 하는데 \"hello\"가 왔다"고 친절하게 알려줘요. 여기서 .()는 익명 함수를 호출하는 문법인데, 값이 함수가 아니라서 예외가 터진 거예요.
이 예외가 나오는 흔한 원인은 두 가지예요. 첫째는 변수에 함수를 담아둔 줄 알았는데 실제로는 그 함수의 결과값이 담긴 경우예요. 예를 들어 handle = &do_something/1처럼 함수를 담아야 하는데 handle = do_something(arg)처럼 호출 결과를 넣어버리면, 나중에 handle.()를 호출할 때 이 예외를 만나게 되죠.
둘째는 함수 전달을 기대하는 고차 함수(high-order function)에 잘못된 값을 넘긴 경우예요. Enum.map/2의 첫 인자가 리스트가 아니거나, 콜백으로 함수가 와야 하는 자리에 상수나 데이터가 들어가면 비슷한 상황이 생겨요.
참고로 함수가 아닌 값을 조건부로 호출하고 싶다면, 호출 전에 is_function/1로 확인하는 게 안전해요. 그래야 예외에 의존하지 않고 분기를 명확하게 만들 수 있어요.
iex> is_function(value)
false
더 알아보기
- Function: 함수 타입과 익명 함수, 함수 캡처에 대해
- is_function/1: 값이 함수인지 확인하는 가드 함수
- Enum.map/2: 함수를 인자로 받는 고차 함수의 대표 예시