ErlangError 예외

ErlangError 예외

Erlang 코드를 호출했는데, 그 코드가 Elixir가 처리하는 값이 아닌 에러 이유(reason)로 실패했을 때 발생하는 예외예요. Erlang과 Elixir를 함께 쓰다 보면 만나는 대표적인 경계 지점이에요.

예를 들어 Erlang 함수를 직접 호출해서 커스텀 에러 이유를 던지면, Elixir는 그것을 ErlangError로 감싸서 알려줘요.

iex> :erlang.error(:some_invalid_error)
** (ErlangError) Erlang error: :some_invalid_error

출처: ErlangError exception

본문

Erlang과 Elixir가 만나는 지점을 생각해 보면 이해가 쉬워요. Elixir는 Erlang 가상 머신(VM) 위에서 돌아가기 때문에, 날것의 Erlang 함수를 그대로 호출하는 경우가 많아요. :erlang 모듈의 함수라든가, Erlang 라이브러리 함수들이 대표적이죠.

이때 대부분의 익숙한 에러 이유는 Elixir가 자동으로 각각에 맞는 예외로 변환해 줘요. 예를 들어 인자가 잘못됐다는 뜻의 :badarg는 그에 해당하는 Elixir 예외로 바뀌어서 나와요. 그래서 평소에는 직접 ErlangError를 만날 일이 많지 않아요.

하지만 Erlang 쪽 코드가 커스텀한 에러 이유를 만들어 던지는 경우가 있어요. 그런 값은 Elixir가 딱히 대응시킬 예외가 없으므로, 그대로 ErlangError로 감싸서 전달해요. 위 예시의 :some_invalid_error처럼 임의의 아톰이 에러 이유로 전달되는 상황이 대표적이죠.

ErlangError는 "Elixir가 미리 약속하지 않은, Erlang이 만든 에러"를 안전하게 감싸기 위한 그릇이에요. 이런 에러를 만났을 때는 어떤 Erlang 함수가 어떤 이유로 실패했는지부터 살펴보는 게 자연스러워요.

더 알아보기

  • :erlang.error/1처럼 의도적으로 에러를 던지는 Erlang 내장 함수의 동작을 함께 확인해 보면 좋아요.
  • Exception 모듈에서 예외가 어떻게 구조화되는지 살펴보면 ErlangError의 위치가 더 분명해져요.
  • Erlang 라이브러리를 Elixir에서 호출하는 방법은 erlang-libraries 문서에서 자세히 다루고 있어요.