Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách thêm dữ liệu ngữ cảnh vào ngoại lệ trong Ruby

Đôi khi kết hợp thông báo lỗi / thông báo lỗi tiêu chuẩn là không đủ. Đôi khi bạn cần thêm dữ liệu để xác định nguyên nhân gây ra lỗi. May mắn thay, nó rất dễ thực hiện trong Ruby.

Tùy chỉnh thông báo lỗi

Cách đơn giản nhất để thêm thông tin theo ngữ cảnh vào lỗi của bạn là thêm nó vào thông báo của ngoại lệ. Trong ví dụ dưới đây, tôi đang tìm một ngoại lệ và nâng cấp lại bằng một thông báo mới:

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

# RuntimeError: bar

Một trường hợp sử dụng tốt cho phương pháp này có thể là khi bạn đang kết xuất một mẫu. Bất kỳ ngoại lệ nào xảy ra bên trong mẫu đều không biết tên tệp của mẫu. Nhưng đó là thông tin khá quan trọng mà bạn cần biết khi gỡ lỗi.

Đây là một ví dụ về cách bạn có thể cứu lỗi mẫu và thêm trước tên tệp vào thông báo.

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

Kết hợp ngoại lệ

Một tùy chọn khác để bao gồm thông tin theo ngữ cảnh trong các ngoại lệ là tạo một ngoại lệ tùy chỉnh. Vì ngoại lệ chỉ là các lớp giống như mọi thứ khác trong Ruby, bạn có thể thêm bao nhiêu attr_accessor tùy thích.

Đây là cách nó có thể trông như thế nào:

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

Sử dụng tính năng ngữ cảnh của Honeybadger

Ừ ừ. Tôi đã phải đưa điều này vào, vì Honeybadger có một cách khá khéo léo để thêm thông tin theo ngữ cảnh vào các trường hợp ngoại lệ của bạn. Thay vì sửa đổi đối tượng ngoại lệ, bạn chỉ cần sử dụng phương thức Honeybadger.context từ bất kỳ đâu trong ứng dụng của mình.

class ApplicationController

  ....

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

end

Khi một ngoại lệ xảy ra, dữ liệu ngữ cảnh sẽ được báo cáo cùng với nó. Sau đó, bạn có thể xem dữ liệu cùng với dữ liệu ngoại lệ khác trong ứng dụng web hoặc ứng dụng dành cho thiết bị di động của chúng tôi.

Cách thêm dữ liệu ngữ cảnh vào ngoại lệ trong Ruby Tính năng ngữ cảnh của Honeybadger cho phép bạn đính kèm bất kỳ thông tin nào bạn cần vào các ngoại lệ mà không cần nhiều mã.