Ruby에서 자신만의 예외(Exception)를 만드는 것은 생각보다 훨씬 간단합니다. 이 글에서는 단계별로 사용자 정의 예외를 생성하고 활용하는 방법을 알아보겠습니다.
1. 새로운 클래스 만들기
Ruby의 모든 것이 그렇듯이, 예외 역시 하나의 클래스입니다. 따라서 새로운 종류의 예외를 만들려면 StandardError 또는 그 하위 클래스를 상속받는 클래스를 정의하기만 하면 됩니다.
class MyError < StandardError
end
raise MyError
관례상 새로운 예외 클래스의 이름은 "Error"로 끝나야 합니다. 또한 커스텀 예외를 모듈(Module) 내부에 넣어두는 것이 좋은 습관으로 여겨집니다. 그렇게 하면 최종적으로 에러 클래스가 ActiveRecord::RecordNotFound, Net::HTTP::ConnectionError처럼 네임스페이스가 포함된 형태가 됩니다.
2. 메시지(Message) 추가하기
Ruby의 모든 예외 객체에는 message 속성이 있습니다. 이것은 예외 이름 옆에 출력되는 좀 더 긴 설명 텍스트입니다.
예외 객체의 message 속성 출력 예시
예외를 발생시킬 때(raise) 다음과 같이 메시지를 직접 지정할 수 있습니다.
raise MyError, "My message"
또한 커스텀 에러 클래스에 자체 생성자(initialize)를 추가하면 기본 메시지를 설정할 수도 있습니다.
class MyError < StandardError
def initialize(msg="My default message")
super
end
end
3. 예외에 커스텀 데이터 속성 추가하기
예외 클래스에도 일반 클래스와 똑같은 방식으로 커스텀 데이터를 추가할 수 있습니다. 아래 예제에서는 속성 리더(attr_reader)를 추가하고 생성자를 업데이트해 보겠습니다.
class MyError < StandardError
attr_reader :thing
def initialize(msg="My default message", thing="apple")
@thing = thing
super(msg)
end
end
begin
raise MyError.new("my message", "my thing")
rescue => e
puts e.thing # "my thing"
end
이것으로 끝입니다! Ruby에서 커스텀 에러나 예외를 만드는 일은 정말 어렵지 않습니다. 다만 한 가지 주의할 점이 있습니다. 위 예제에서 항상 StandardError를 상속받았다는 점을 눈치채셨나요? 이것은 의도적인 것입니다. Ruby에는 Exception이라는 클래스도 존재하지만, 절대로 이 클래스를 직접 상속해서는 안 됩니다. 자세한 내용이 궁금하다면 Exception과 StandardError의 차이점을 다룬 별도의 글을 참고해 보시기 바랍니다.