Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby에서 예외에 컨텍스트 데이터를 추가하는 3가지 방법

때로는 표준 백트레이스와 에러 메시지의 조합만으로는 오류의 원인을 파악하기에 부족할 때가 있습니다. 문제의 근본 원인을 찾으려면 추가적인 데이터가 필요하죠. 다행히 Ruby에서는 이를 아주 간단하게 구현할 수 있습니다.

1. 에러 메시지 커스터마이징

예외에 컨텍스트 정보를 추가하는 가장 간단한 방법은 예외 메시지 자체에 정보를 담는 것입니다. 아래 예제에서는 발생한 예외를 잡아 새로운 메시지와 함께 다시 던지고(re-raise) 있습니다.

begin
  raise "foo"
rescue => e
  raise e.class, "bar"
end

# RuntimeError: bar

이 방식이 빛을 발하는 대표적인 사례가 바로 템플릿 렌더링입니다. 템플릿 내부에서 발생한 예외는 자신이 어떤 파일에서 실행되고 있는지 알지 못하지만, 디버깅 관점에서 파일명은 매우 중요한 단서입니다.

다음은 템플릿 오류를 rescue로 처리한 뒤, 메시지 앞에 파일명을 붙여 다시 발생시키는 예제입니다.

filename = "mytemplate.erb"
template = File.read(filename) # "<% 1/0 %>" 포함

erb = ERB.new(template)

begin
  erb.result
rescue => e
  raise e.class, [filename, e.message].join(": ")
end

# ZeroDivisionError: mytemplate.erb: divided by 0

2. 커스텀 예외 클래스로 감싸기

컨텍스트 정보를 담는 또 다른 방법은 커스텀 예외 클래스를 직접 만드는 것입니다. Ruby에서 예외 역시 평범한 클래스일 뿐이므로, 필요한 만큼 attr_reader나 attr_accessor를 자유롭게 추가할 수 있습니다.

구현 예시는 다음과 같습니다.

class TemplateError < StandardError
  attr_reader :filename

  def initialize(msg, filename)
    @filename = filename
    super(msg)
  end
end

begin
  ERB.new(template).result
rescue => e
  raise TemplateError.new(e.message, filename)
end

이렇게 만들어 두면 rescue 블록에서 error.filename처럼 구조화된 데이터에 바로 접근할 수 있어, 로그 분석이나 알림 처리가 훨씬 수월해집니다.

3. Honeybadger의 컨텍스트 기능 활용

마지막으로 Honeybadger를 소개합니다. Honeybadger에는 예외에 컨텍스트 정보를 손쉽게 붙일 수 있는 세련된 기능이 내장되어 있습니다. 예외 객체를 직접 수정하는 대신, 애플리케이션 어디에서든 Honeybadger.context 메서드를 호출하기만 하면 됩니다.

class ApplicationController
  ...

  def find_current_user
    user = ...
    Honeybadger.context(user_id: user.id, user_email: user.email, scope: "user")
  end
end

예외가 발생하면 설정해 둔 컨텍스트 데이터가 함께 리포팅되며, 웹 또는 모바일 대시보드에서 다른 예외 정보와 함께 확인할 수 있습니다.

Honeybadger의 컨텍스트 기능을 활용하면 코드를 거의 추가하지 않고도 예외에 필요한 정보를 자유롭게 첨부할 수 있습니다.

정리하면, 간단한 경우에는 메시지에 정보를 붙이고, 재사용성이 필요하면 커스텀 예외 클래스를, 에러 모니터링 도구를 사용 중이라면 Honeybadger의 context 기능을 활용하는 것이 좋습니다. 상황에 맞는 방법을 선택해 디버깅 효율을 한층 끌어올려 보세요.