Đô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.
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ã.