System.EnvError — 시스템 환경 변수가 없을 때의 예외

System.EnvError — 시스템 환경 변수가 없을 때의 예외

시스템의 환경 변수(environment variable)가 설정되어 있지 않을 때 Elixir가 던지는 예외가 System.EnvError예요.

출처: System.EnvError — An exception raised when a system environment variable is not set

본문

System.get_env/1은 환경 변수가 없으면 nil을 돌려주지만, System.fetch_env!/1은 환경 변수가 반드시 존재하길 요구해요. 존재하지 않으면 이 예외를 던져서 프로그래머가 실수를 바로 알아채도록 해요.

iex> System.fetch_env!("NOT_A_REAL_VAR")
** (System.EnvError) could not fetch environment variable "NOT_A_REAL_VAR" because it is not set

이처럼 설정돼야 마땅한 필수 환경 변수를 읽을 때는 System.fetch_env!/1을 쓰는 것이 안전해요. 누락되면 즉시 예외로 알려주니까요. 반대로 선택적인(optional) 변수라면 System.get_env/1로 읽어 nil 여부를 직접 판단하면 돼요. 두 함수를 상황에 맞게 구분해서 쓰면 환경 변수 누락을 깜빡하고 넘어가는 실수를 줄일 수 있어요.

참고로 System.fetch_env/2처럼 예외를 던지지 않고 {:ok, value} / :error 튜플을 돌려주는 형태도 있어요. 예외를 의도적으로 잡아 처리(그리고 예외 명세로 문서화)하고 싶다면 fetch_env!/1을, 값의 유무를 평범한 데이터로 다루고 싶다면 fetch_env/2를 쓰면 돼요.

이 예외는 System.EnvError 구조체로 만들어지며, 환경 변수 이름을 담고 있어요. 에러 메시지에는 어떤 변수가 없었는지 정확히 표시되므로, 여러 설정이 필요한 코드에서 어떤 변수가 빠졌는지 금방 알 수 있죠. 특히 배포·배포 파이프라인처럼 환경에 의존하는 코드에서는 fetch_env!/1을 쓰면 누락된 변수를 조기에 잡아내서 "설정이 빠진 채로 서버가 이상하게 동작하는" 사고를 예방할 수 있어요.

더 알아보기

  • 관련 함수: System.fetch_env!/1, System.get_env/1, System.fetch_env/2
  • 관련 예외: SystemLimitError (시스템 한계 도달 예외)