`CompileError`

CompileError

코드를 컴파일하는 과정에서 오류가 발생했을 때 던져지는 예외예요.

예를 들어 다음과 같이 undefined variable를 사용하면 이 예외가 발생합니다:

1 = y
** (CompileError) iex:1: undefined variable "y"

다음 필드는 공개 필드라서 자유롭게 접근할 수 있어요:

  • :file (t:Path.t/0 또는 nil) — 오류가 발생한 파일. 오류가 파일이 아닌 곳에서 온 코드에서 발생했다면 nil
  • :line (t:non_neg_integer/0) — 오류가 발생한 줄 번호
  • :description (t:String.t/0) — 컴파일 오류에 대한 설명

이 예외는 대부분 Elixir 도구가 코드를 컴파일하거나 평가할 때 던져집니다.

출처: CompileError

본문

컴파일 단계는 코드가 실행되기 직전에 이뤄지는 검사관 같은 역할을 해요. 문법이 맞는지, 변수가 정의돼 있는지, 타입이 서로 맞는지 등을 미리 확인하는데, 이 단계에서 문제가 발견되면 실제로 코드를 돌리지도 못한 채 CompileError가 발생합니다.

위 예시를 보면 조금 더 선명해져요. 1 = y라는 코드에서 y는 아직 정의된 적 없는 변수예요. 이건 실행 시점에 값을 계산해서 발생하는 오류가 아니라, 코드를 읽는 순간 "이런 변수는 존재하지 않는다"고 판단되는 문제죠. 그래서 컴파일러가 이를 잡아내고 undefined variable "y"라고 알려주는 겁니다.

이 예외가 다른 런타임 예외와 다른 점도 바로 여기 있어요. CompileError는 코드가 실행되기 전, 컴파일 타임에 발생한다는 겁니다. 때문에 이 예외를 try/catch로 잡아서 처리한다는 개념 자체가 잘 맞지 않아요. 보통은 오류 메시지에서 알려준 위치를 보고 코드 자체를 고치는 게 정답입니다.

디버깅을 돕기 위해 이 예외는 오류 위치와 내용을 필드로 들고 있어요. :file은 어느 파일에서, :line은 몇 번째 줄에서 문제가 생겼는지, 그리고 :description은 문제의 실제 내용을 알려줍니다. 파일 이외의 경로에서 온 코드, 예를 들어 iex처럼 명령줄에서 바로 평가된 코드라면 :filenil일 수 있어요.

CompileError는 "이 코드는 애초에 제대로 빌드되지 않는다"는 신호이므로, 메시지가 가리키는 줄과 설명을 보고 소스를 고치는 방향으로 접근하는 게 자연스러워요.

더 알아보기

  • 코드가 실행되는 동안 일어나는 문제는 RuntimeError 같은 다른 예외가 담당합니다.
  • iex에서 즉석으로 코드를 평가할 때도 같은 컴파일 오류가 그대로 노출돼요.
  • Elixir의 컴파일 과정 전반은 공식 가이드에서 더 자세히 다룹니다.