บางครั้ง backtrace และข้อความแสดงข้อผิดพลาดมาตรฐานอาจไม่เพียงพอ คุณอาจต้องการข้อมูลเพิ่มเติมเพื่อระบุสาเหตุของข้อผิดพลาดได้อย่างแม่นยำ โชคดีที่ Ruby ทำให้เรื่องนี้ง่ายมาก
การปรับแต่งข้อความแสดงข้อผิดพลาด
วิธีที่ง่ายที่สุดในการเพิ่มข้อมูลบริบทให้กับข้อผิดพลาดคือการเพิ่มข้อมูลเข้าไปในข้อความของ exception ในตัวอย่างด้านล่าง ผมจับ exception แล้วโยนมันใหม่พร้อมข้อความใหม่:
begin
raise "foo"
rescue => e
raise e.class, "bar"
end
# RuntimeError: bar
กรณีการใช้งานที่ดีสำหรับวิธีนี้คือเมื่อคุณกำลัง render template ข้อผิดพลาดที่เกิดขึ้นภายใน template จะไม่รู้จักชื่อไฟล์ของ template แต่ข้อมูลนี้สำคัญมากเมื่อต้อง debug
นี่คือตัวอย่างวิธีจับข้อผิดพลาดของ template และเพิ่มชื่อไฟล์เข้าไปในข้อความ:
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
การห่อหุ้ม Exception
ตัวเลือกอีกอย่างสำหรับการเพิ่มข้อมูลบริบทคือการสร้าง custom exception เนื่องจาก exceptions ใน Ruby ก็เป็นคลาสเช่นเดียวกับสิ่งอื่นๆ คุณจึงสามารถเพิ่ม attr_accessors ได้ไม่จำกัด
รูปแบบการทำจะเป็นดังนี้:
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
การใช้ฟีเจอร์ Context ของ Honeybadger
ต้อง承認ว่า Honeybadger มีวิธีที่น่าสนใจในการเพิ่มข้อมูลบริบทให้กับ exceptions แทนที่จะแก้ไข object ของ exception เอง คุณเพียงแค่ใช้เมธอด Honeybadger.context จากจุดใดก็ได้ในแอปพลิเคชัน
class ApplicationController
...
def find_current_user
user = ...
Honeybadger.context(
user_id: user.id,
user_email: user.email,
user_scope: "user"
)
end
end
เมื่อเกิดข้อผิดพลาด ข้อมูล context จะถูกรายงานไปพร้อมกับ exception คุณสามารถดูข้อมูลนี้ร่วมกับข้อมูล exception อื่นๆ ในเว็บหรือแอปมือถือของเรา
ฟีเจอร์ context ของ Honeybadger ให้คุณผนวกข้อมูลที่ต้องการให้กับ exceptions ได้โดยไม่ต้องเขียนโค้ดมาก