Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

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

때로는 표준 역추적/오류 메시지 콤보가 충분하지 않습니다. 때때로 오류의 원인을 찾기 위해 추가 데이터가 필요합니다. 다행히 Ruby에서는 매우 쉽습니다.

오류 메시지 사용자 정의

오류에 컨텍스트 정보를 추가하는 가장 간단한 방법은 예외 메시지에 추가하는 것입니다. 아래 예에서는 예외를 포착하고 새 메시지로 다시 발생시킵니다.

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

# RuntimeError: bar

이 접근 방식의 좋은 사용 사례는 템플릿을 렌더링할 때일 수 있습니다. 템플릿 내부에서 발생하는 모든 예외는 템플릿의 파일 이름을 알지 못합니다. 하지만 이는 디버깅할 때 알아야 할 매우 중요한 정보입니다.

다음은 템플릿 오류를 복구하고 메시지 앞에 파일 이름을 추가하는 방법의 예입니다.

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

e = ERB.new(template) 

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

# ZeroDivisionError: mytemplate.erb: divided by 0

예외 래핑

예외에 컨텍스트 정보를 포함하는 또 다른 옵션은 사용자 정의 예외를 만드는 것입니다. 예외는 Ruby의 다른 모든 것과 같은 클래스일 뿐이므로 원하는 만큼 attr_accessor를 추가할 수 있습니다.

다음과 같이 보일 수 있습니다.

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

Honeybadger의 컨텍스트 기능 사용

그래 그래. Honeybadger는 예외에 컨텍스트 정보를 추가하는 매우 매끄러운 방법을 가지고 있기 때문에 이것을 넣어야 했습니다. 예외 개체를 수정하는 대신 애플리케이션의 어디에서나 Honeybadger.context 메서드를 사용하기만 하면 됩니다.

class ApplicationController

  ....

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

end

예외가 발생하면 컨텍스트 데이터가 함께 보고됩니다. 그런 다음 웹 또는 모바일 앱에서 다른 예외 데이터와 함께 데이터를 볼 수 있습니다.

Ruby에서 예외에 컨텍스트 데이터를 추가하는 방법 Honeybadger의 컨텍스트 기능을 사용하면 많은 코드 없이 예외에 필요한 모든 정보를 첨부할 수 있습니다.