Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การเพิ่มข้อมูลบริบทให้กับ Ruby Exceptions: คู่มือปฏิบัติจริง

บางครั้ง 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 อื่นๆ ในเว็บหรือแอปมือถือของเรา

การเพิ่มข้อมูลบริบทให้กับ Ruby Exceptions: คู่มือปฏิบัติจริง ฟีเจอร์ context ของ Honeybadger ให้คุณผนวกข้อมูลที่ต้องการให้กับ exceptions ได้โดยไม่ต้องเขียนโค้ดมาก