Đôi khi cặp backtrace/thông báo lỗi tiêu chuẩn 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, việc này rất dễ dàng trong Ruby.
Tùy chỉnh thông báo lỗi
Cách đơn giản nhất để thêm thông tin ngữ cảnh vào ngoại lệ là thêm nó vào thông báo của ngoại lệ. Trong ví dụ dưới đây, tôi bắt một ngoại lệ và ném lại nó với 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 cách tiếp cận này có thể là khi bạn đang render một template. Bất kỳ ngoại lệ nào xảy ra bên trong template đều không biết tên file của template. Nhưng đó là thông tin rất quan trọng để bạn debug.
Dưới đây là ví dụ về cách bạn có thể rescue lỗi template và thêm tên file vào đầu thông báo.
filename = "mytemplate.erb" template = File.read(filename) # Chứa "<% 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
Gói ngoại lệ (Wrapping)
Một tùy chọn khác để đưa thông tin ngữ cảnh vào ngoại lệ là tạo một ngoại lệ tùy chỉnh. Vì ngoại lệ chỉ là các class 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 thực hiện:
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
Sử dụng tính năng context của Honeybadger
Tôi phải nhắc đến đây, vì Honeybadger có một cách khá hay để thêm thông tin ngữ cảnh vào ngoại lệ. 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.
class ApplicationController .... def find_current_user user = ... Honeybadger.context(user_id: user.id, user_email: user.email, user.scope: "user") end end
Khi ngoại lệ xảy ra, dữ liệu context sẽ được báo cáo cùng với nó. Sau đó bạn có thể xem dữ liệu đó cùng với các dữ liệu ngoại lệ khác trong ứng dụng web hoặc mobile.
Tính năng context 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 ngoại lệ mà không cần nhiều code.