Inspect.Error

Inspect.Error (exception)

구조체(struct)를 inspect할 수 없을 때 일어나는 예외예요. Inspect 프로토콜이 자료 구조를 문자열 표현으로 바꾸는 과정에서 실패하면, Elixir가 이 예외를 일으켜요.

출처: Inspect.Error

본문

보통 Elixir는 어떤 값이든 inspect해서 터미널이나 로그에 출력할 수 있어요. 그런데 구조체의 inspect 구현이 오류를 일으키거나, 구조체가 처리할 수 없는 상태에 있을 때는 정상적으로 표현을 만들어내지 못해요. 그럴 때 Inspect.Error 예외가 발생해요.

기본으로 Inspect 프로토콜은 inspect 중 실패가 생기면 이 예외로 감싸서 던져요. 이는 Inspect.Opts:safe 옵션과 관련이 있어요. :safe 옵션이 true(기본값)면 구조체 inspect가 실패해도 Inspect.Error로 감싸져서, 한 구조체의 문제 때문에 로그나 inspect 출력 전체가 멈추는 일을 막아줘요. 반면 :safe 옵션이 false면 실패가 Inspect.Error로 감싸지지 않고 그대로 오류로 던져져요. 이건 커스텀 Inspect 구현이 왜 실패하는지 디버깅할 때 유용해요.

이 예외가 잡히면 보통 Elixir는 해당 구조체를 원시(raw) 표현으로 대체해 출력을 계속 진행해요. 덕분에 프로그램 전체가 멈추지 않고, 문제가 있는 값만 간단한 형태로 보여주는 거예요.

더 알아보기

  • Inspect — 구조체가 어떻게 inspect되는지 커스터마이즈하는 프로토콜
  • Inspect.Opts:safe 옵션을 비롯한 inspect 옵션
  • Inspect.Algebra — inspect 표현을 만드는 대수 문서 함수

실무에서의 모습

이 예외를 직접 만들어 던질 일은 거의 없어요. 대신 inspect 과정에서 발생하는 예외로 마주치게 돼요. 예를 들어 구조체의 필드에 inspect할 수 없는 값이 들어 있거나, 커스텀 Inspect 구현이 실패하면 이 예외가 나타나요. 일반적인 Elixir 코드에서는 이런 예외가 곧바로 사용자에게 노출되기보다, Elixir가 구조체를 원시 표현으로 대체하고 나머지 출력을 계속 진행하도록 처리되기 때문에 잘 안 보이고요.

디버깅할 때는 :safe 옵션을 false로 바꿔 실제 오류를 그대로 드러내는 게 도움이 돼요. 그러면 Inspect.Error로 감싸지지 않은 채 원래 예외가 보여서, 어느 지점에서 inspect가 실패하는지 더 쉽게 찾을 수 있어요.