คีย์เวิร์ดล้มเหลวทำอะไรใน Ruby?


88

ฉันกำลังเรียนรู้ Ruby และพบfailคีย์เวิร์ด หมายความว่าอย่างไร?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end

9
นอกเหนือจากคำตอบด้านล่างแล้วสิ่งที่ควรค่าแก่การรู้ว่าผู้คนใช้raiseเมื่อจัดการข้อยกเว้นและfailเมื่อไม่
บาลา

6
ไม่ใช่คีย์เวิร์ด แต่เป็นวิธีการ
Jörg W Mittag

เอกสารประกอบ: Kernel # fail
Jared Beck

นอกจากนี้คุณสามารถเขียนสิ่งเหล่านี้เป็นคำสั่งบรรทัดเดียว: fail "Password too short" if password.length < 8และfail "No user name set" unless username
PhilT

คำตอบ:


137

ใน Ruby failมีความหมายเหมือนกันกับraise. failคำหลักเป็นวิธีการที่โมดูลซึ่งรวมโดยชั้นเรียนKernel วิธีการทำให้เกิดข้อผิดพลาด runtime เช่นเดียวกับคำหลักObjectfailraise

failวิธีมีสาม overloads:

  • fail: เพิ่มข้อความRuntimeErrorโดยไม่มีข้อผิดพลาด

  • fail(string): เพิ่มRuntimeErrorอาร์กิวเมนต์สตริงเป็นข้อความแสดงข้อผิดพลาด:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): เพิ่มข้อยกเว้นของคลาสexception(อาร์กิวเมนต์แรก) พร้อมด้วยข้อความแสดงข้อผิดพลาด (อาร์กิวเมนต์ที่สอง) และข้อมูลการเรียกกลับ (อาร์กิวเมนต์ที่สาม)

    ตัวอย่าง: สมมติว่าคุณกำหนดฟังก์ชันที่ควรล้มเหลวหากได้รับอาร์กิวเมนต์ที่ไม่ดี จะดีกว่าที่จะเพิ่มArgumentErrorและไม่RuntimeError:

    fail ArgumentError, "Illegal String"
    

    อีกตัวอย่างหนึ่ง: คุณสามารถส่งผ่านbacktraceทั้งหมดไปยังfailเมธอดเพื่อให้คุณสามารถเข้าถึงการติดตามภายในrescueบล็อก:

    fail ArgumentError, "Illegal String", caller
    

    callerเป็นวิธี Kernel file:line: in 'method'ซึ่งผลตอบแทนการติดตามย้อนหลังเป็นอาร์เรย์ของสตริงในรูปแบบที่

โดยไม่มีข้อโต้แย้งให้ยกข้อยกเว้นเป็น $! หรือเพิ่ม RuntimeError ถ้า $! เป็นศูนย์ ด้วยอาร์กิวเมนต์สตริงเดียวเพิ่ม RuntimeError ด้วยสตริงเป็นข้อความ มิฉะนั้นพารามิเตอร์แรกควรเป็นชื่อของคลาส Exception (หรืออ็อบเจ็กต์ที่ส่งคืนอ็อบเจ็กต์ Exception เมื่อส่งข้อความยกเว้น) พารามิเตอร์ที่สองซึ่งเป็นทางเลือกจะตั้งค่าข้อความที่เกี่ยวข้องกับข้อยกเว้นและพารามิเตอร์ที่สามคืออาร์เรย์ของข้อมูลการเรียกกลับ ข้อยกเว้นถูกจับโดยอนุประโยคการช่วยเหลือของ start ... end block

ที่มา: ทับทิมเอกสารในเคอร์เนลโมดูล


2
คุณสามารถยกตัวอย่างง่ายๆ 3 จุดพร้อมสัญลักษณ์แสดงหัวข้อย่อย 3 จุดได้หรือไม่? จะทำให้คำตอบของคุณเป็นรูปธรรมมากขึ้น .. :)
อรุณรักจิตร

1
ว้าว +1 Crazybob ดีกว่า Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky

มันใช้งานได้สำหรับฉัน แต่ Rubocop แปลงเป็นraise
paul

32

Rubocopกล่าวเกี่ยวกับการใช้ทั้งสองคำ

'ใช้failแทนraiseสัญญาณข้อยกเว้น'

'ใช้raiseแทนfailการยกเลิกข้อยกเว้น'

นี่คือตัวอย่าง

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end

+1 สำหรับคำแนะนำสไตล์; แม้ว่าจะมีความหมายเหมือนกันโดยใช้แต่ละอย่างในการตั้งค่าที่ตั้งใจไว้ก็ช่วยถ่ายทอดความตั้งใจได้ดีขึ้น
fatuhoku

26

fail == raise

กล่าวอีกนัยหนึ่งfailเป็นเพียงนามแฝงยอดนิยมสำหรับraiseวิธีการเพิ่มข้อผิดพลาด การใช้งาน:

fail ArgumentError, "Don't argue with me!"

7

www.ruby-doc.orgคือเพื่อนของคุณ เมื่อฉัน googled rubydoc fail" Kernel " เป็นครั้งแรก คำแนะนำของฉันคือเมื่อมีข้อสงสัยให้ไปที่แหล่งที่มาที่ชัดเจนสำหรับคำจำกัดความเช่นนี้


2
Woot นั่นคือ FAIL จริงๆ ตัวอย่างรหัสสำหรับความล้มเหลวคือการคัดลอกวางจากการเพิ่ม o_O
Vajk Hermecz

4
@VajkHermecz ล้มเหลวเป็นนามแฝงของการเพิ่มดังนั้นจึงนำเอกสารมาใช้ซ้ำ เปรียบเทียบกับเอกสารสำหรับ Array # map และ Array # collect
Jamie Macey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.