TokenMissingError 예외
TokenMissingError 예외
코드를 파싱하다 보면 "토큰이 없어졌다"는 오류를 만나게 돼요. 이 예외는 바로 그 상황, 즉 코드를 해석하는 과정에서 토큰이 빠졌을 때 발생해요. 컴파일러나 Elixir 툴링이 코드를 평가할 때 주로 던지는 예외예요.
본문
TokenMissingError는 코드를 파싱할 때 토큰이 누락된 경우 발생하는 예외예요.
예를 들어 열린 괄호를 닫지 않은 코드를 평가하려 하면 다음과 같이 던져져요.
iex> Code.eval_string("[1, 2, 3")
** (TokenMissingError) token missing on nofile:1:9:
...
이 예외는 다음과 같은 공개 필드를 가지며, 자유롭게 접근할 수 있어요.
:file(Path.t/0또는nil) - 오류가 발생한 파일 경로예요. 파일이 아닌 코드에서 오류가 발생했다면nil이 돼요.:line- 여는 구분자(딜리미터)의 줄 번호예요.:column- 여는 구분자의 열 번호예요.:end_line- 문자열이 끝나는 줄 번호예요.:end_column- 문자열이 끝나는 열 번호예요.:opening_delimiter- 여는 구분자를 나타내는 아톰이에요.:expected_delimiter- 예상되는 구분자를 나타내는 아톰이에요.:description- 누락된 토큰 오류에 대한 설명이에요.
이 예외는 대부분 Elixir 툴링이 코드를 컴파일하거나 평가할 때 발생해요. 닫는 괄호·대괄호·중괄호 같은 토큰이 없이 코드가 끝나면 이 예외를 만나게 되죠.
이 예외의 필드들을 살펴보면 위치 정보가 상당히 세밀하다는 걸 알 수 있어요. :line과 :column은 여는 구분자의 위치를, :end_line과 :end_column은 문자열이 끝나는 지점을 가리켜요. 보통 :line·:column과 :end_line·:end_column이 서로 다르게 잡히는데, 그만큼 "어디서부터 닫히지 않은 채 시작됐는지"를 정확히 알려 주는 거예요. 디버깅할 때는 :opening_delimiter와 :expected_delimiter를 비교해 보면 어떤 구분자가 닫히지 않았는지 금방 파악할 수 있어요.
참고로 이 예외를 직접 던질 일은 거의 없어요. 이 예외는 Elixir 파서가 내부적으로 사용하는 예외라서, 일반적인 애플리케이션 코드에서는 만나기 어려워요. 보통 Code.eval_string/1이나 Code.compile_string/1처럼 문자열을 코드로 바꾸는 함수를 호출할 때, 잘못된 문법 때문에 간접적으로 마주치게 되죠. 오류 메시지에 "token missing"이라는 문구가 보이면 "토큰이 닫히지 않았다"는 뜻이니 입력으로 준 코드의 괄호·문자열·구분자를 살펴보면 해결 실마리를 찾을 수 있어요.