ErlangError 예외
ErlangError 예외
Erlang 코드를 호출했는데, 그 코드가 Elixir가 처리하는 값이 아닌 에러 이유(reason)로 실패했을 때 발생하는 예외예요. Erlang과 Elixir를 함께 쓰다 보면 만나는 대표적인 경계 지점이에요.
예를 들어 Erlang 함수를 직접 호출해서 커스텀 에러 이유를 던지면, Elixir는 그것을 ErlangError로 감싸서 알려줘요.
iex> :erlang.error(:some_invalid_error)
** (ErlangError) Erlang error: :some_invalid_error
본문
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문서에서 자세히 다루고 있어요.