RuntimeError 예외
RuntimeError 예외
일반적인 런타임 오류를 나타내는 예외예요. Elixir를 처음 쓰다 보면 아마 가장 자주 만나는 예외 중 하나일 거예요. 특히 raise/1에 문자열 메시지만 넘기면 이 RuntimeError가 만들어집니다.
본문
raise/1에 문자열만 주면 메시지로 삼아 RuntimeError를 던져요.
iex> raise "oops!"
** (RuntimeError) oops!
이 예외는 가능한 한 아껴 쓰는 게 좋아요. 대부분의 경우 애플리케이션이나 라이브러리에 맞는 자신만의 예외를 정의하는 편이 더 낫기 때문이에요. 다만 예상하지 못한 조건이 발생하긴 하는데, 그때 의미 있는 오류 메시지를 남기고 싶은 상황이 있어요. 그런 경우에는 RuntimeError가 좋은 선택이 될 수 있습니다.
필드(Fields)
RuntimeError 예외는 :message(String.t/0)라는 필드 하나를 가져요. 이 필드는 공개되어 있어서 RuntimeError 예외를 읽거나 만들 때 자유롭게 접근할 수 있습니다.
iex> e = RuntimeError.exception(message: "custom message")
iex> e.message
"custom message"
언제 카스텀 예외를 쓰는 게 좋을까
RuntimeError를 쓰면 코드가 단순해지지만, 예외의 종류가 "그냥 무언가 잘못됨" 하나로 뭉개지는 단점이 있어요. 반대로 모듈 안에서 defexception으로 정의한 예외는 해당 도메인 상황을 표현하고, rescue에서 MatchError나 KeyError처럼 구체적으로 잡아낼 수 있어요. 그래서 오류가 "어떤 종류의 문제"인지 호출자가 구분할 필요가 있다면 카스텀 예외가 더 분명합니다.
더 알아보기
raise/1— 문자열 메시지로 예외를 던지는 매크로defexception— 자신만의 예외를 정의하는 매크로Exception— 예외 구조체와 관련 함수 문서try/rescue— 예외를 잡아 처리하는 제어 구조