ฉันจะเพิ่มข้อยกเว้นใน Rails ให้ทำงานเหมือนกับข้อยกเว้น Rails อื่น ๆ ได้อย่างไร


92

ฉันต้องการเพิ่มข้อยกเว้นเพื่อให้ทำเช่นเดียวกับข้อยกเว้นของ Rails ปกติ แสดงข้อยกเว้นและการติดตามสแต็กในโหมดการพัฒนาเป็นพิเศษและแสดงหน้า "ขออภัยมีข้อผิดพลาดเกิดขึ้น" ในโหมดการผลิต

ฉันลองทำสิ่งต่อไปนี้:

raise "safety_care group missing!" if group.nil?

แต่มันเขียน"ERROR signing up, group missing!"ลงในไฟล์ development.log


2
ข้อความแสดงข้อผิดพลาดที่คุณโพสต์ดูเหมือนจะไม่มาจากข้อยกเว้นนี้ (เป็นข้อความอื่น) นี่คือสิ่งที่คุณเห็นหรือไม่?
levinalex

คำตอบ:


140

คุณไม่ต้องทำอะไรเป็นพิเศษก็ควรจะใช้งานได้

เมื่อฉันมีแอพรางใหม่พร้อมตัวควบคุมนี้:

class FooController < ApplicationController
  def index
    raise "error"
  end
end

และไปที่ http://127.0.0.1:3000/foo/

ฉันเห็นข้อยกเว้นที่มีการติดตามสแต็ก

คุณอาจไม่เห็น stacktrace ทั้งหมดในบันทึกของคอนโซลเนื่องจาก Rails (ตั้งแต่ 2.3) กรองบรรทัดจากการติดตามสแต็กที่มาจากเฟรมเวิร์กเอง

ดูconfig/initializers/backtrace_silencers.rbในโครงการ Rails ของคุณ


2
คำตอบที่กระชับและยอดเยี่ยม
rcd

1
ลิงก์ skitch (เห็นข้อยกเว้นพร้อมการติดตามสแต็ก) ไม่ทำงานอีกต่อไป
Asaf

@levinalex สิ่งนี้จะปลอดภัยในโหมดการผลิตเพื่อแสดง stacktrace หรือไม่
BKSpurgeon

@levinalex - ขอบคุณอเล็กซ์ มีวิธีใดบ้างในการเพิ่มสตริงที่กำหนดเองลงในข้อความแสดงข้อผิดพลาด
BKSpurgeon

63

คุณสามารถทำได้ดังนี้:

class UsersController < ApplicationController
  ## Exception Handling
  class NotActivated < StandardError
  end

  rescue_from NotActivated, :with => :not_activated

  def not_activated(exception)
    flash[:notice] = "This user is not activated."
    Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip
    redirect_to "/"
  end

  def show
      // Do something that fails..
      raise NotActivated unless @user.is_activated?
  end
end

สิ่งที่คุณกำลังทำอยู่นี้คือการสร้างคลาส "NotActivated" ที่จะใช้เป็น Exception เมื่อใช้การเพิ่มคุณสามารถโยน "NotActivated" เป็นข้อยกเว้นได้ Rescue_from เป็นวิธีการจับ Exception ด้วยวิธีการที่ระบุ (not_activated ในกรณีนี้) เป็นตัวอย่างที่ค่อนข้างยาว แต่ควรแสดงให้คุณเห็นว่ามันทำงานอย่างไร

ด้วยความปรารถนาดี
Fabian


สิ่งนี้ไม่แสดงข้อยกเว้นและการติดตามสแต็กในโหมดการพัฒนาและแสดงหน้า "ขออภัยมีข้อผิดพลาดเกิดขึ้น" ในโหมดการผลิต
Chirag Patel

2
หน้า "ขออภัย" เป็นตัวจัดการข้อผิดพลาด 500 ของเว็บเซิร์ฟเวอร์ของคุณ ตรวจสอบไฟล์. htaccess ของคุณและคุณมักจะเห็นที่นั่น
Jeff Paquette

อาจจะไม่ใช่คำตอบสำหรับ OP แต่เป็นตัวอย่างที่มีประโยชน์มากขอบคุณ!
Neil Stockbridge

12

หากคุณต้องการวิธีที่ง่ายกว่านี้และไม่ต้องการความยุ่งยากมากนักการดำเนินการง่ายๆอาจเป็นดังนี้:

raise Exception.new('something bad happened!')

สิ่งนี้จะเพิ่มข้อยกเว้นพูดeด้วยe.message = something bad happened!

จากนั้นคุณสามารถช่วยเหลือมันได้ในขณะที่คุณกำลังช่วยเหลือข้อยกเว้นอื่น ๆ ทั้งหมดโดยทั่วไป


ไม่ควรเพิ่มหรือช่วยเหลือ 'Exception' ด้วยตัวเองให้ลองใช้ StandardError แทน ดูรายละเอียดได้ที่stackoverflow.com/questions/10048173/…
เอกมัยสิงห์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.