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

ข้อยกเว้นใน Ruby

ข้อยกเว้น เป็นโครงสร้างข้อมูลพิเศษที่เก็บข้อมูลเกี่ยวกับพิเศษ สภาพที่เกิดขึ้นในใบสมัครของคุณ ข้อยกเว้นคือสัญญาณที่ส่งเมื่อโปรแกรมของคุณไม่สามารถทำงานต่อได้ เนื่องจากไม่ทราบวิธีจัดการกับสถานการณ์เฉพาะ ใน Ruby เราเรียกการส่งสัญญาณว่า เพิ่ม เป็นข้อยกเว้น

raise 'this is an exception'
 
puts "This message won't be printed."

วิธีที่เร็วที่สุดที่จะเห็นข้อยกเว้นในการดำเนินการคือการเลี้ยงดูตัวเอง โดยใช้ raise วิธีที่มีข้อความ Ruby จะสร้าง RuntimeError โดยมีข้อความที่ส่งผ่านเป็นคำอธิบาย นอกจากนี้ยังจะเพิ่มการติดตามสแต็กที่ชี้ไปยังตำแหน่งที่มีข้อยกเว้นในโค้ดของคุณ

$ ruby raise.rb
raise.rb:1:in `<main>': this is an exception (RuntimeError)

เมื่อเรียกใช้สคริปต์ตัวอย่างด้านบน คุณจะสังเกตเห็นว่าตามที่สัญญาไว้ ข้อความจะไม่ถูกพิมพ์หลังจากยกข้อยกเว้นขึ้น นั่นเป็นเพราะข้อยกเว้นที่ไม่สามารถจัดการได้จะหยุดการทำงานของโปรแกรมของคุณโดยทำให้เกิดความผิดพลาด ทั้งนี้เพื่อให้แน่ใจว่าแอปพลิเคชันของคุณจะไม่ทำงานต่อไปหลังจากล้มเหลวในการทำงานอย่างใดอย่างหนึ่งให้เสร็จสิ้น

ข้อยกเว้นประเภทต่างๆ

ภายใน Ruby ยกข้อยกเว้นเมื่อมีสิ่งผิดปกติ ตัวอย่างเช่น คุณจะได้รับข้อยกเว้นเมื่อพยายามหารตัวเลขด้วยศูนย์

irb(main):001:0> 42/0
ZeroDivisionError: divided by 0
        from (irb):1:in `/'
        from (irb):1
        from /Users/jeff/.asdf/installs/ruby/2.3.0/bin/irb:11:in `<main>'

ในกรณีนี้ ประเภทของข้อยกเว้นคือ ZeroDivisionError แทนที่จะเป็น RuntimeError เราเห็นมาก่อน มีข้อยกเว้นหลายสิบประเภทเพื่อสร้างลำดับชั้นข้อยกเว้นของ Ruby และทั้งหมดถูกหยิบยกขึ้นในสถานการณ์ที่แตกต่างกัน

RuntimeError เป็นคลาสข้อยกเว้นทั่วไป แต่มีตัวอย่างเฉพาะเจาะจงมากขึ้น NoMethodError ถูกยกขึ้นเมื่อพยายามเรียกเมธอดที่ไม่มีอยู่ และ ArgumentError สังเกตว่าอาร์กิวเมนต์ที่ไม่ถูกต้องถูกส่งไปยังวิธีการที่มีอยู่เป็นต้น

ข้อยกเว้นการช่วยเหลือ

แอปพลิเคชันส่วนใหญ่ต้องการความสามารถในการกู้คืนจากข้อยกเว้น ในเว็บแอปพลิเคชัน ข้อผิดพลาดอาจเกิดขึ้นได้เมื่อผู้ใช้ส่งข้อมูลผิดพลาดในแบบฟอร์ม ซึ่งจะส่งผลให้มีการแสดงข้อความแสดงข้อผิดพลาดต่อผู้ใช้แทนที่จะทำให้เว็บเซิร์ฟเวอร์ทั้งหมดขัดข้อง

ในกรณีเช่นนี้ อาจมีข้อยกเว้นเกิดขึ้น แต่เว็บเซิร์ฟเวอร์จะได้รับการช่วยเหลือก่อนที่จะไปถึงด้านบนสุดของ call stack ซึ่งป้องกันข้อยกเว้นไม่ให้แอปพลิเคชันขัดข้อง

begin
  raise 'this is an exception'
rescue RuntimeError => exception
  puts "Exception rescued: #{exception.inspect}"
  # => "Exception rescued: #<RuntimeError: this is an exception>"
end
 
puts "This message *will* be printed."

การรวมตัวอย่างก่อนหน้านี้ในบล็อกเริ่มต้น/กู้ภัย ข้อยกเว้นจะไม่ถูกยกขึ้น และจะไม่ทำให้แอปของเราขัดข้อง แต่จะมีการดำเนินการ Rescue-block ซึ่งจะพิมพ์ข้อความอธิบายว่าข้อยกเว้นถูกขัดขวาง ในกรณีนี้ นอกจากนี้ เนื่องจากเป็นการป้องกันแอปของเราจากการหยุดทำงาน ข้อความสุดท้าย จะ รับพิมพ์

ตัวอย่างนี้กู้คืนจาก RuntimeError . โดยเฉพาะ s ดังนั้นข้อผิดพลาดอื่น ๆ จะไม่ถูกจับ ความเฉพาะเจาะจงเกี่ยวกับข้อผิดพลาดที่ได้รับการช่วยเหลือนั้นสะดวก เพราะจะช่วยให้คุณทำสิ่งต่าง ๆ ได้เมื่อเกิดข้อผิดพลาดต่างกัน นอกจากนี้ สิ่งสำคัญคือต้องไม่ช่วยเหลือข้อยกเว้นมากเกินไป

สำหรับไพรเมอร์ในเชิงลึกเกี่ยวกับการจัดการข้อยกเว้น และเคล็ดลับบางประการเกี่ยวกับวิธีการช่วยเหลือข้อยกเว้นอย่างเหมาะสม โปรดดูไพรเมอร์ข้อยกเว้นของเราใน Ruby Magic

มีคำถามเกี่ยวกับการเพิ่มหรือจับข้อยกเว้นใน Ruby หรือไม่? โปรดอย่าลังเลที่จะแจ้งให้เราทราบที่ @AppSignal แน่นอน เราอยากทราบว่าคุณชอบบทความนี้อย่างไร หรือหากคุณมีหัวข้ออื่นที่ต้องการทราบข้อมูลเพิ่มเติม