วิธีหนึ่งใช้การช่วยเหลือใน Ruby โดยไม่ต้องบล็อกเริ่มต้นและสิ้นสุด


115

ฉันรู้ถึงเทคนิคมาตรฐานในการเริ่มต้นการช่วยเหลือ

เราจะใช้บล็อกช่วยเหลือด้วยตัวเองได้อย่างไร

มันทำงานอย่างไรและจะรู้ได้อย่างไรว่ามีการตรวจสอบโค้ดใด


คำตอบ:


223

เมธอด "def" สามารถใช้เป็นคำสั่ง "เริ่มต้น":

def foo
  ...
rescue
  ...
end

3
นอกจากนี้นิยามคลาสนิยามโมดูลและ (ฉันคิดว่า) do/ endบล็อกลิเทอรัลยังสร้างบล็อกข้อยกเว้นโดยปริยาย
Jörg W Mittag

คุณช่วย def ช่วยให้แน่ใจว่าจบด้วยหรือไม่?
Mohamed Hafez

คุณสามารถทำการช่วยเหลือ def ได้อย่างแน่นอนเช่นกัน :-)
Antony

คุณสามารถใช้การช่วยเหลือมากกว่าหนึ่งครั้งใน def ของคุณได้หรือไม่?
marriedjane875

@ marriedjane875 ใช่คุณสามารถใช้การช่วยชีวิตได้หลายรายการอย่างชัดเจน (แต่ละประโยค / บล็อกการช่วยเหลือในบรรทัดของตัวเอง) เช่นrescue TypeError; rescue NameError- หรือคุณสามารถคั่นด้วยเครื่องหมายจุลภาคระหว่างคลาสข้อยกเว้นเช่นrescue TypeError, NameError
chemturion

48

คุณยังสามารถช่วยเหลือแบบอินไลน์ได้:

1 + "str" rescue "EXCEPTION!"

จะพิมพ์ "EXCEPTION!" ออกมา เนื่องจาก "สตริงไม่สามารถบังคับเป็น Fixnum"


1
คุณจะช่วยเหลือและแสดงข้อยกเว้นย้อนหลังแบบอินไลน์ได้อย่างไร?
Cyril Duchon-Doris

จะคืนข้อยกเว้นจริงได้อย่างไร?
user1735921

1
การช่วยเหลือแบบอินไลน์ไม่ใช่แนวทางปฏิบัติที่ดีเนื่องจากช่วยชีวิตStandardErrorและคลาสย่อยทั้งหมดเช่นNameError- หมายความว่าแม้การพิมพ์ผิดในโค้ดของคุณจะไม่ทำให้เกิดข้อผิดพลาด .. ดูthoughtbot.com/blog/don-t-inline-rescue-in- ทับทิม
BrunoFacca

26

ฉันใช้ชุดค่า def / rescue เป็นจำนวนมากกับการตรวจสอบ ActiveRecord:

def create
   @person = Person.new(params[:person])
   @person.save!
   redirect_to @person
rescue ActiveRecord::RecordInvalid
   render :action => :new
end

ฉันคิดว่านี่เป็นรหัสแบบลีนมาก!


19

ตัวอย่าง:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

นี่defเป็นbeginคำสั่ง:

def
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.